这是.settle() 的 ES6 兼容版本,它允许完成所有承诺,然后您可以查询每个结果以查看它是成功还是失败:
// ES6 version of settle
Promise.settle = function(promises) {
function PromiseInspection(fulfilled, val) {
return {
isFulfilled: function() {
return fulfilled;
}, isRejected: function() {
return !fulfilled;
}, isPending: function() {
// PromiseInspection objects created here are never pending
return false;
}, value: function() {
if (!fulfilled) {
throw new Error("Can't call .value() on a promise that is not fulfilled");
}
return val;
}, reason: function() {
if (fulfilled) {
throw new Error("Can't call .reason() on a promise that is fulfilled");
}
return val;
}
};
}
return Promise.all(promises.map(function(p) {
// make sure any values or foreign promises are wrapped in a promise
return Promise.resolve(p).then(function(val) {
return new PromiseInspection(true, val);
}, function(err) {
return new PromiseInspection(false, err);
});
}));
}
这可以像这样适应 Q 库:
// Q version of settle
$q.settle = function(promises) {
function PromiseInspection(fulfilled, val) {
return {
isFulfilled: function() {
return fulfilled;
}, isRejected: function() {
return !fulfilled;
}, isPending: function() {
// PromiseInspection objects created here are never pending
return false;
}, value: function() {
if (!fulfilled) {
throw new Error("Can't call .value() on a promise that is not fulfilled");
}
return val;
}, reason: function() {
if (fulfilled) {
throw new Error("Can't call .reason() on a promise that is fulfilled");
}
return val;
}
};
}
return $q.all(promises.map(function(p) {
// make sure any values or foreign promises are wrapped in a promise
return $q(p).then(function(val) {
return new PromiseInspection(true, val);
}, function(err) {
return new PromiseInspection(false, err);
});
}));
}
与您的特定代码一起使用:
var items = ["URL1", "URL2", "URL3"];
$q.settle(items.map(function(url) {
return $http.get(url);
})).then(function(data){
data.forEach(function(item) {
if (item.isFulfilled()) {
console.log("success: ", item.value());
} else {
console.log("fail: ", item.reason());
}
});
});
注意:.settle() 返回一个始终解析,从不拒绝的承诺。这是因为无论你传递了多少个 Promise 都被拒绝,它仍然会解析,但会返回关于你传递的哪些 Promise 被解析或被拒绝的信息。