Javascript ES6承诺/在满足多个承诺后调用函数(不能使用promissions.all)

Javascript ES6承诺/在满足多个承诺后调用函数(不能使用promissions.all),javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,我正在编写Javascript,它需要这些事件按以下顺序发生: 同时触发几个API调用 完成所有调用并返回响应后,执行一行代码 听起来很简单,但棘手的是我不能使用Promissions.all(),因为我仍然希望在所有承诺都实现之后执行这行代码,不管成功与否。除非我误解了Promises.all(),否则一次失败将导致代码行在then()中不执行,而在error()中执行得太快 我很可能遗漏了一些明显的东西,但我能看到的唯一其他方法是将API调用承诺链接在一起,但这将导致不同时触发它们。所以基本

我正在编写Javascript,它需要这些事件按以下顺序发生:

  • 同时触发几个API调用
  • 完成所有调用并返回响应后,执行一行代码
  • 听起来很简单,但棘手的是我不能使用Promissions.all(),因为我仍然希望在所有承诺都实现之后执行这行代码,不管成功与否。除非我误解了Promises.all(),否则一次失败将导致代码行在then()中不执行,而在error()中执行得太快

    我很可能遗漏了一些明显的东西,但我能看到的唯一其他方法是将API调用承诺链接在一起,但这将导致不同时触发它们。所以基本上我认为我需要一个版本的Promises.all(),它不是“快速失败”


    这样做的正确方法是什么?

    要严格使用ES6承诺,您需要将每个承诺包装在另一个包装承诺中,当包装承诺履行或拒绝时,这个问题就会得到解决

    您可以这样做:

    Promise.all( 
      promises.map( promise => Promise.resolve( promise ).catch( _=>_ ) )
    ).then ( function ( ) {
        // All promises finished
    } );
    

    这假设
    承诺
    是一系列承诺和/或价值观。

    可能有比这更巧妙的方法,甚至是这种特定方法的更好的书面版本,但不是使用承诺。总之,您可以将行为链接到每个承诺(对于then和catch,所以这并不重要)更新主承诺中的值

    const allPromises = arrayOfPromises => Promise((resolve,reject)=> {
      const ln = arrayOfPromises.length,
            done = 0;
    
      const allDone => _ => {
        if(++done===ln){ resolve(); }
      }
      arrayOfPromises.map(p=>p.then(allDone).catch(allDone));
    });
    

    Promise.all()是一个接一个地链接多个承诺(如果它们具有依赖关系)。因此,如果其中一个失败,它将根本不尝试其他方法,并将返回到您的捕获()。如果您对拒绝案例(错误)有容忍度,那么您应该手动将您的承诺与then和catch链接起来,并通过其catch()处理被拒绝的操作,并继续该catch()的下一个承诺。不确定说它不会“尝试”是否准确其他人:他们都已经开始运行的时候,他们通过承诺。所有。因此,无论它们有什么行为,以及单独链接到每个.then/catch()操作上的任何.then/catch()操作都将继续运行@Bergi我不认为它是一种反模式,因为它使事情更具可读性,但我更新了它以避免使用Promise构造函数。除了它没有,实际上:-)顺便说一句,你可以简化得更多:
    。然后(null,
    。catch(
    )谢谢Bergi和Paulpro(以及Dtipson),我是新的承诺,仍然试图理解这里给出的答案,我会张贴回来,当我尝试我的实现!很抱歉,重复的问题,我在最初搜索答案时找不到该线程!我能够使用你的答案,而且它似乎完全满足了我的需要,再次感谢你!