Javascript ES6承诺/在满足多个承诺后调用函数(不能使用promissions.all)
我正在编写Javascript,它需要这些事件按以下顺序发生:Javascript ES6承诺/在满足多个承诺后调用函数(不能使用promissions.all),javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,我正在编写Javascript,它需要这些事件按以下顺序发生: 同时触发几个API调用 完成所有调用并返回响应后,执行一行代码 听起来很简单,但棘手的是我不能使用Promissions.all(),因为我仍然希望在所有承诺都实现之后执行这行代码,不管成功与否。除非我误解了Promises.all(),否则一次失败将导致代码行在then()中不执行,而在error()中执行得太快 我很可能遗漏了一些明显的东西,但我能看到的唯一其他方法是将API调用承诺链接在一起,但这将导致不同时触发它们。所以基本
这样做的正确方法是什么?要严格使用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),我是新的承诺,仍然试图理解这里给出的答案,我会张贴回来,当我尝试我的实现!很抱歉,重复的问题,我在最初搜索答案时找不到该线程!我能够使用你的答案,而且它似乎完全满足了我的需要,再次感谢你!