ES6承诺/在多个承诺完成后调用函数(不能使用Promises.all)

时间:2016-04-28 18:54:24

标签: javascript ecmascript-6 es6-promise

我正在编写需要按​​此顺序发生这些事件的Javascript:

  1. 同时触发多个API调用
  2. 完成所有调用并返回响应后,执行一行代码
  3. 听起来很简单,但棘手的部分是我不能使用Promises.all()因为我仍然希望在完成所有承诺,成功与否之后执行该行代码。除非我误解Promises.all(),否则一个失败会导致代码行不在then()中执行并在error()中执行得太快。

    我很可能会遗漏一些显而易见的东西,但我能看到的唯一另一种方法是将API调用promises链接在一起,但这会导致不会立即触发它们。所以基本上我认为我需要一个版本的Promises.all(),它不会快速失败"。

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

2 个答案:

答案 0 :(得分:3)

要严格使用ES6承诺,您需要将每个承诺包装在另一个包装承诺中,该承诺在包装的承诺得到满足或拒绝时得到解决。

你可以这样做:

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

这假定promises是一组承诺和/或值。

答案 1 :(得分:1)

可能有一种比这更流畅的方式,甚至是这种特定方法的更好的书面版本,但不是使用Promise.all,你可以将行为链接到每个promise(对于then和catch,所以它不会更新主Promise中的值。

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));
});