gpt4 book ai didi

javascript - For 循环、异步等待、 promise - Javascript

转载 作者:行者123 更新时间:2023-12-04 09:29:58 26 4
gpt4 key购买 nike

我正在尝试使用 for 循环遍历数组并对每个项目执行异步函数。我希望这按顺序发生,并且我不希望数组中下一项的下一个异步函数在前一项的异步函数完成之前执行。
我正在使用 await 并 promise 尝试这样做。但是,我一定是做错了什么,因为代码似乎无法正常工作。 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 ,这是一个问题,因为您解决一个 promise 只是为了创建主线程正在等待的第二个 promise 。你所要做的就是返回 db.collection... 给你的 promise 。
从根本上说,问题在于您创建的新 promise 没有正确解决。你只是说 promise 是(resolve, reject) => {resolve;}这是A)甚至不是真正的功能,B)不会解决。因为你没有调用 resolve 函数。诚然,这个 promise 永远不应该被创建,因为它完全没有必要,所以我更担心只是处理简单的等待和返回的 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();

关于javascript - For 循环、异步等待、 promise - Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62886108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com