铁匠铺,
首先让我们假设您的Promise在一个数组中。
var promises = [....];
您似乎想要的是.when()
应用于这些Promise的一些转换,这样任何被拒绝的Promise都会被转换为已解决,同时对已经解决的Promise是透明的。
所需的操作可以非常简洁地写成如下:
$.when.apply(null, $.map(promises, resolvize)).done(...);
//or, if further filtering by .then() is required ...
$.when.apply(null, $.map(promises, resolvize)).then(...);
resolvize
转换机制在哪里。
那么应该是什么resolvize()
样子呢?让我们利用 的特性.then()
来区分已解决和已拒绝的Promise,并做出相应的响应。
function resolvize(promise) {
//Note: null allows a resolved promise to pass straight through unmolested;
return promise.then(null, function() {
return $.Deferred().resolve.apply(null, arguments).promise();
});
}
未经测试
与resolvize
在某些外部范围,它可以被提供给被用在$.when.apply($.map(promises, resolvize))
任何需要它的表达。这很可能就足够了,而无需使用新方法扩展 jQuery。
不管如何实现转换,最终都会遇到一个潜在的问题;即知道.done()
回调的每个参数,其对应的Promise最初是被解决还是被拒绝。这就是您将拒绝转换为解决方案所要付出的代价。但是,您可能能够从解决/拒绝原始Promise的参数中检测原始状态。