Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待所有asyc进程在循环中完成_Javascript_Async Await - Fatal编程技术网

Javascript 等待所有asyc进程在循环中完成

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( "

我有一个循环,我正在比较两个数据库。在循环结束时,我将保存所做的更改数量我需要确保在完成所有工作后运行“日志结果”。

像这样的东西可以工作,但是由于“get”上的“wait”而很慢

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”改变了返回行为。改变你的建议效果很好。