Javascript 如何在元素数组上同步调用异步函数?
如何在元素数组上同步调用异步函数,以便只在对当前元素的异步调用完成后调用下一个异步函数 例如,如果我们看下面的代码Javascript 如何在元素数组上同步调用异步函数?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,如何在元素数组上同步调用异步函数,以便只在对当前元素的异步调用完成后调用下一个异步函数 例如,如果我们看下面的代码 const fetch = require("cross-fetch"); function wait(a) { fetch(`https://jsonplaceholder.typicode.com/todos/${a}`) .then(response => response.json()) .then(json => co
const fetch = require("cross-fetch");
function wait(a) {
fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
.then(response => response.json())
.then(json => console.log(json));
}
const data = [1, 2, 3, 5, 6, 7, 8, 9, 10];
async function test() {
for (const ele of data) {
await wait(ele);
}
}
test();
每当我执行上述代码时,它都会随机记录响应,但不会根据数组同步记录响应。i、 e
{"userId":1,"id":8,"title":"quo adipisci enim quam ut ab","completed":true}
{"userId":1,"id":9,"title":"molestiae perspiciatis ipsa","completed":false}
{"userId":1,"id":10,"title":"illo est ratione doloremque quia maiores aut","completed":true}
{"userId":1,"id":7,"title":"illo expedita consequatur quia in","completed":false}
{"userId":1,"id":1,"title":"delectus aut autem","completed":false}
{"userId":1,"id":6,"title":"qui ullam ratione quibusdam voluptatem quia omnis","completed":false}
{"userId":1,"id":3,"title":"fugiat veniam minus","completed":false}
{"userId":1,"id":5,"title":"laboriosam mollitia et enim quasi adipisci quia provident illum","completed":false}
{"userId":1,"id":2,"title":"quis ut nam facilis et officia qui","completed":false}
在这里,你可以清楚地看到,这些反应并不有序。是否有任何方法可以同步调用这些函数,但只能在完成当前调用后调用。您的函数
wait
没有返回其承诺
,因此您实际上正在唤醒未定义的(我很惊讶这不会爆炸)。因此,异步正在以一种火而忘的方式发生。所有承诺都在同一执行帧中启动(而不是在前一个承诺完成时按连续顺序启动)
在此处添加return
语句:
function wait(a) {
return fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
.then(response => response.json())
.then(json => console.log(json));
}
通过返回承诺
,循环中的等待
现在将阻塞(异步),直到返回的承诺
完成。现在代码的其余部分按预期运行。来自MDN,expression
导致异步函数执行暂停,直到承诺得到解决(即,履行或拒绝),并在履行后恢复异步函数的执行。当恢复时,等待表达式的值就是已实现承诺的值
但是,在您的函数中,函数返回的是null
未定义的
,也来自文档
如果wait运算符后面的表达式的值不是承诺,则它将转换为已解析的承诺
添加一个返回应该可以修复它
function wait(a) {
// missing return statement
// to fix, add a `return` infront of fetch
fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
.then(response => response.json())
.then(json => console.log(json));
}
希望这能起作用。只需将函数代码包装在承诺中,如下所示:
function wait(a) {
return new Promise((resolve, reject) => {
fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
.then(response => resolve(response.json()))
.then(json => reject(json));
});
}
那么代码的其余部分应该按预期工作。仍然对它感到困惑吗?你能告诉我它是怎么工作的吗@Hereticmonkey就用你从spender那里得到的答案吧。null
和undefined
在JS中是不同的。void
函数“返回”undefined
,而不是null
。
function wait(a) {
return fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
.then(response => response.json());
}
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
async function test() {
for await (const ele of data) {
await wait(ele).then(json => console.log(JSON.stringify(json)));
}
}
function wait(a) {
return new Promise((resolve, reject) => {
fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
.then(response => resolve(response.json()))
.then(json => reject(json));
});
}