对于循环,async等待,promise-Javascript



我正在尝试使用for循环来遍历数组,并对每个项执行异步函数。我希望这种情况按顺序发生,并且我不希望数组中下一项的下一个异步函数在上一项的异步函数完成之前执行。

我正在使用等待和承诺来尝试做到这一点。然而,我一定做错了什么,因为代码似乎工作不正常。for循环似乎只工作一次。

这是我的代码:

function asyncFunc(i)
{
//Here I am updating my database which is the async part of this function
return db.collection("collection").doc("doc").update({
})

.then(function(){  
let d = new Date();
console.log(i + " async COMPLETED at: " + d.getTime());
return new Promise((resolve, reject) => {
resolve;
});
});
}
async function doWork()
{
var numbers = [1,2,3,4];
for(const i of numbers)
{
var d = new Date();
console.log(i + " async CALLED at: " + d.getTime());
await asyncFunc(i);
}
}
doWork();

这是控制台输出:

1 async CALLED at: 1594683980009
1 async COMPLETED at: 1594683980280

为什么会发生这种情况?

因此,您返回了两个promise,这是一个问题,因为您解决了其中一个,只创建了第二个,然后主线程正在等待。您所要做的就是返回db.collection…给您的promise。

从根本上讲,问题在于你创造的新承诺没有得到妥善解决。你只是说承诺是(resolve, reject) => {resolve;},它A(甚至不是一个真正的函数,B(不会解决。因为您没有调用resolve函数。的确,这个承诺永远不应该被创建,因为它完全没有必要,所以我更担心的是用简单的等待和回报来处理承诺,而不是去创建它们。TL;DR如果已经存在可以使用的承诺,则不要创建承诺。

这个代码应该工作:

function asyncFunc(i)
{
//Here I am updating my database which is the async part of this function
return db.collection("collection").doc("doc").update({
})
.then(() =>{  
let d = new Date();
console.log(i + " async COMPLETED at: " + d.getTime());
});
}
async function doWork()
{
var numbers = [1,2,3,4];
for(const i of numbers)
{
var d = new Date();
console.log(i + " async CALLED at: " + d.getTime());
await asyncFunc(i);
}
}
doWork();

为了清楚您遇到的实际问题,问题出在您的代码块上:

return new Promise((resolve, reject) => {
resolve;
});

问题是resolve需要是一个实际执行的函数。因此,您需要的是:

return new Promise((resolve, reject) => {
resolve();
});

最新更新