JavaScript Promise.all是否有成功和失败时触发的回调

Tay*_*sky 11 javascript ecmascript-6 es6-promise

我误解了Promise.all吗?我在数组中有X个promise,我正在尝试聚合数组的成功/失败率.

以下是我认为我所知道的:

Promise.all采取了一系列承诺.

如果所有承诺都成功,则.then运行回调.

如果其中一个promise失败,则.catch调用回调,传入的参数是单个引发的错误的值.

如果有些成功并且有些失败,则没有回复触发,这是所有承诺的结果.即它不能给你一个类似(伪代码)的数组[success, fail, success, success]- 就像人们所期望的那样,可以在许多JS库中找到它们(ajax,ember等).

它就.then像是一个更像是.success一个函数,而不是一个在所有承诺完成后总是运行的函数,无论一些成功还是一些失败.为什么没有.when .finally .runThisShizNoMatterWhat?或者我错过了什么(非常可能)?

log*_*yth 14

这与Bluebird Promise.all有关- 多个承诺完成了聚合成功和拒绝,但这是特定于Bluebird的.问题的核心是,如果你想检查某些事情是成功还是失败,那么你并不是真的要求每个承诺的直接结果.相反,您希望在使用之前转换承诺Promise.all.这个ES6标准的承诺没有帮助,但实现起来却微不足道.在大多数图书馆中,这被称为Promise.settle.例如

var someThings = [...]; // some list of promises that may succeed or fail
settle(someThings).then(results => {
  results.forEach(result => {
    if (result.state === 'fullfilled'){
      console.log('succeeded', result.value);
    } else {
      console.log('failed', result.value);
    }
  });
});


function settle(arr){
  return Promise.all(arr.map(promise => {
    return promise.then(
      value => ({state: 'fullfilled', value}),
      value => ({state: 'rejected', value})
    );
  }));
}
Run Code Online (Sandbox Code Playgroud)


kra*_*raf 2

Promise.all创建一个新的承诺,只能整体解决或拒绝。也许您可以将其视为具有every数组方法语义,当第一个元素与谓词不匹配时,该语义将返回 false。

then函数最多接受两个参数,第二个参数是被拒绝的处理程序。从这个意义上说,它不仅仅是一个success,它实际上可以处理所有情况。这catch只是一种便捷方法,是 的缩写.then(undefined, function(reason) { ... })

恐怕 Promise API 没有你需要的东西,你必须自己实现它。