我正在编写需要按此顺序发生这些事件的Javascript:
听起来很简单,但棘手的部分是我不能使用Promises.all()因为我仍然希望在完成所有承诺,成功与否之后执行该行代码。除非我误解Promises.all(),否则一个失败会导致代码行不在then()中执行并在error()中执行得太快。
我很可能会遗漏一些显而易见的东西,但我能看到的唯一另一种方法是将API调用promises链接在一起,但这会导致不会立即触发它们。所以基本上我认为我需要一个版本的Promises.all(),它不会快速失败"。
这样做的正确方法是什么?
答案 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));
});