【发布时间】:2015-11-16 13:31:28
【问题描述】:
考虑以下包含 Bluebird 的 Promise.settle 的简化实现的代码:
var a = Promise.reject('a');
var b = Promise.resolve('b');
var c = Promise.resolve('c');
var promises = [a,b,c];
function settled(promises) {
var alwaysFulfilled = promises.map(function (p) {
return p.then(
function onFulfilled(value) {
return { state: 'fulfilled', value: value };
},
function onRejected(reason) {
return { state: 'rejected', reason: reason };
}
);
});
return Promise.all(alwaysFulfilled);
}
//Update status message once all requests finish
settled(promises).then(function (outcomes) {
var count = 0;
outcomes.forEach(function (outcome) {
if (outcome.state == 'fulfilled') count++;
});
console.log(count + ' out of ' + outcomes.length + ' balances were updated');
});
这将记录“已更新 3 个余额中的 2 个”。为什么这与普通的 Promise.all 的工作方式不同? alwaysFulfilled 不应该仍然包含一个被拒绝的 promise 作为它的第一个元素吗?
答案似乎在于我对承诺如何工作的困惑。如果我在控制台中创建了一个被拒绝的承诺,那么它就像这样:
var a = Promise.reject('a');
var b = a.then(function() {}, undefined);
var c = a.then(undefined, function() {});
a
Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: "a"}
b
Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: "a"}
c
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}
为什么 c 被“解析”了?
【问题讨论】:
标签: javascript promise bluebird