对于循环,异步等待,承诺-Javascript
我试图使用for循环来迭代数组,并对每个项执行异步函数。我希望这种情况按顺序发生,并且我不希望数组中下一项的下一个异步函数在上一项的异步函数完成之前执行 我正在使用等待和承诺来尝试这样做。但是,我一定是做错了什么,因为代码似乎工作不正常。for循环似乎只工作一次 这是我的密码:对于循环,异步等待,承诺-Javascript,javascript,asynchronous,Javascript,Asynchronous,我试图使用for循环来迭代数组,并对每个项执行异步函数。我希望这种情况按顺序发生,并且我不希望数组中下一项的下一个异步函数在上一项的异步函数完成之前执行 我正在使用等待和承诺来尝试这样做。但是,我一定是做错了什么,因为代码似乎工作不正常。for循环似乎只工作一次 这是我的密码: function asyncFunc(i) { //Here I am updating my database which is the async part of this function return d
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
为什么会发生这种情况?因此,您返回了两个承诺,这是一个问题,因为您解决一个承诺只是为了创建一个主线程正在等待的第二个承诺。您所要做的就是返回db.collection。。。给你 从根本上说,问题在于您创建的新承诺没有得到正确解决。你只是说承诺是
(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();
});
谢谢,它确实有用!然而,我并没有完全理解这个解释。为什么创造第二个承诺是个问题?我没有正确地解析它吗?所以,我不会撒谎,我不是JS和异步函数的高手,所以我真的不知道,但我基本上不知道为什么要在.then()中返回一个值。1) 你只是不需要它,你已经有了承诺,2)你应该通过调用resolve()来解决承诺,而不仅仅是键入它。编辑:做了更多的阅读并更新了我的答案。你最初的问题不是
返回新承诺((解决,拒绝)=>{resolve;})代码>而不是返回新承诺((解析,拒绝)=>{resolve();})代码>您实际上并没有在那里调用解析函数,这正是您需要做的。@Muirik,您完全正确。我试图在我对答案的编辑中解释这一点。坦白地说,我的第一反应就是在没有真正检查它的情况下,去掉无关的代码。我必须再看一眼才能找出问题所在。我感谢你提供了比我更清楚的答案。我知道如何使代码看起来正确,但我在细节上苦苦挣扎。这更清楚。