每个数组元素的异步调用并等待完成[重复]

Posted

技术标签:

【中文标题】每个数组元素的异步调用并等待完成[重复]【英文标题】:Async calls per each array element and wait for completion [duplicate] 【发布时间】:2018-10-12 22:16:15 【问题描述】:

我发现了许多类似的问题,但没有一个具有相同目的(或者我只是不明白?也可以这样)。

我有一个元素数组,一个对元素执行异步操作并返回一个承诺的函数 A,我正在处理的函数 B 应该为每个数组元素调用 A,并返回一次承诺所有的 A 调用都已完成。我怎样才能做到这一点? 相关代码:

var img = [];
img[0] = "http://www.something.com/picture0.jpg";
img[1] = "http://www.something.com/picture1.jpg";
img[2] = "http://www.something.com/picture2.jpg";
function ask(img)
    
    return new Promise((resolve, reject) =>
        
        if(something)
            resolve("test");
        else
            reject("test");
        
    
function analyze_all(img)
    
    for(var i in img)
        
        ask(img[i])
        .then((res) => 
            
            ???
            )
        .catch((err) =>
            
            ???
            );
        
    return ???
    

我想过将所有结果推送到一个列表中,如下所示:

function analyze_all(img)
    
    var ret = [];
    for(var i in img)
        
        ask(img[i])
        .then((res) => 
            
            ret.push(image: img[i], data: res);
            )
        .catch((err) =>
            
            ret.push(image: img[i], error: err);
            );
        
    return ???
    

但是我怎么知道所有异步调用什么时候完成呢? 请帮忙!


解决了。此外,如果有人有类似的需求并且想要获得所有“返回”值,无论他们是解决还是拒绝,我建议检查以下链接: https://nmaggioni.xyz/2016/10/13/Avoiding-Promise-all-fail-fast-behavior/

【问题讨论】:

您可以使用Promise.all 将promise 列表转换为解析为列表的promise。 我没看懂,列表中必须包含函数调用返回的Promise或者resolved的值? 承诺会在某个时候解析为你想要的值。 【参考方案1】:

你在正确的轨道上,使用Promise.all

function analyze_all(img) 
    var ret = [];
    for(var i in img) 
        ret.push( 
          ask(img[i]).then((res) => 
            // something
          )
          .catch((err) => 
            // something
          )
        )
    
    return Promise.all(ret);

【讨论】:

@barnack 不,不是吗? 好的,我只是需要时间来理解这个概念以及如何处理结果,谢谢你的回答!

以上是关于每个数组元素的异步调用并等待完成[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在for-each-loop中等待异步调用[重复]

等待先前的异步功能完成[重复]

如何让另一个异步调用等待?

在 iOS 中等待多个网络异步调用

如何实现对数据库的异步调用 [重复]

等待多个异步调用完成?