铁匠铺,
首先让我们假设您的承诺在一个数组中。
var promises = [....];
您似乎想要的东西被.when()
应用于这些承诺的一些转换,这样任何被拒绝的承诺都被转换为已解决,同时对已经解决的承诺是透明的。
所需的操作可以非常简洁地编写如下:
$.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()
回调的每个参数,其对应的承诺最初是被解决还是被拒绝。这就是您将拒绝转化为解决方案所付出的代价。但是,您可能能够从解决/拒绝原始承诺的参数中检测到原始状态。