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)
Promise.all
创建一个新的承诺,只能整体解决或拒绝。也许您可以将其视为具有every
数组方法语义,当第一个元素与谓词不匹配时,该语义将返回 false。
该then
函数最多接受两个参数,第二个参数是被拒绝的处理程序。从这个意义上说,它不仅仅是一个success
,它实际上可以处理所有情况。这catch
只是一种便捷方法,是 的缩写.then(undefined, function(reason) { ... })
。
恐怕 Promise API 没有你需要的东西,你必须自己实现它。