Javascript 等待所有asyc进程在循环中完成
我有一个循环,我正在比较两个数据库。在循环结束时,我将保存所做的更改数量我需要确保在完成所有工作后运行“日志结果”。 像这样的东西可以工作,但是由于“get”上的“wait”而很慢Javascript 等待所有asyc进程在循环中完成,javascript,async-await,Javascript,Async Await,我有一个循环,我正在比较两个数据库。在循环结束时,我将保存所做的更改数量我需要确保在完成所有工作后运行“日志结果”。 像这样的东西可以工作,但是由于“get”上的“wait”而很慢 for( let i = 0; i < json.data.length; i++ ) { var newEntry = new PopulateNewEntry( ... ); entryArray.push( newEntry ); await wixData.get( "
for( let i = 0; i < json.data.length; i++ )
{
var newEntry = new PopulateNewEntry( ... );
entryArray.push( newEntry );
await wixData.get( "MyDatabase", newEntry._id ) // <--- Slow
.then( async results => {
if( results === null )
{
//...Async process to write new entry to database.
}
else if( results are different )
{
//...Async process to modify entry in database.
}
})
}
LogResults();
for(让i=0;i
我在这里看到过使用promise数组并等待全部完成的方法。但我想我不知道如何在履行承诺的同时使用它。我发现的所有示例都没有在等待的函数上使用“.then”
类似于下面的内容,但这不起作用。似乎从未完成“等待”
var pending = [];
for( let i = 0; i < json.data.length; i++ )
{
var newEntry = new PopulateNewEntry( ... );
entryArray.push( newEntry );
const promise = wixData.get( "MyDatabase", newEntry._id )
.then( async results => {
if( results === null )
{
//...Async process to write new entry to database.
}
else if( results are different )
{
//...Async process to modify entry in database.
}
})
pending.push( promise );
}
const array = await Promise.all( pending );
LogResults();
var挂起=[];
for(设i=0;i{
如果(结果===null)
{
//…将新条目写入数据库的异步进程。
}
else if(结果不同)
{
//…修改数据库中条目的异步进程。
}
})
待定。推送(承诺);
}
常量数组=等待承诺。全部(待定);
日志结果();
我做错了什么?@Terry已经在评论中给了你答案,但让我进一步说明 正如他在链接
时已经提到的那样,然后将返回一个“已确定”的承诺。这不是你想要的承诺。全部
你应该这样做:
const promise=wixData.get(“MyDatabase”,newEntry.\u id);
承诺。然后(…);
待定。推送(承诺);
另外,除非你真的需要同步行为,为什么不使用等待来实现承诺呢。所有的只要链接一个。然后就可以了?只是个主意
如果您希望获得最佳性能,不要等待每个承诺一个接一个地完成,请像第二个示例中那样调用所有承诺,然后等待它们全部完成。请检查,您并不是将一个挂起的承诺推送到数组,而是一个已经实现的承诺,因为您已经链接了。然后()
。非常好的解释(也感谢Terry)。我没有意识到链接“.then”改变了返回行为。改变你的建议效果很好。