[英]For loops, async await, promises - Javascript
我正在尝试使用 for 循环遍历数组并在每个项目上执行异步 function。 我希望这按顺序发生,并且我不希望数组中下一个项目的下一个异步 function 执行,直到前一个项目的异步 function 完成。
我正在使用 await 并承诺尝试这样做。 但是,我一定做错了什么,因为代码似乎无法正常工作。 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();
这是控制台 output:
1 async CALLED at: 1594683980009
1 async COMPLETED at: 1594683980280
为什么会这样?
因此,您返回了两个承诺,这是一个问题,因为您解决一个只是为了创建第二个,然后主线程正在等待。 您所要做的就是返回 db.collection... 给您的 promise。
从根本上说,问题在于您创建的新 promise 没有正确解决。 您只是说 promise 是(resolve, reject) => {resolve;}
这是 A) 甚至不是真正的 function 和 B) 不会解决。 因为您没有调用解析 function。 确实,这个 promise 不应该被创建,因为它完全没有必要,所以我更担心只处理简单的等待和返回的承诺,而不是创建它们。 TL;DR 如果已经存在可以使用的 promise,请不要创建 promise。
此代码应该可以工作:
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
需要是实际执行的 function。 因此,您需要的是:
return new Promise((resolve, reject) => {
resolve();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.