在如何无极规范很可能对未来有PromiseInspection
对象会精神,这里有一个jQuery的添加 - 功能上,告诉你,当所有的承诺都做了,是否履行或拒绝:
// pass either multiple promises as separate arguments or an array of promises
$.settle = function(p1) {
var args;
if (Array.isArray(p1)) {
args = p1;
} else {
args = Array.prototype.slice.call(arguments);
}
function PromiseInspection(fulfilled, val) {
return {
isFulfilled: function() {
return fulfilled;
}, value: function() {
return fulfilled ? val: undefined;
}, reason: function() {
return !fulfilled ? val: undefined;
}
};
}
return $.when.apply($, args.map(function(p) {
// if incoming value, not a promise, then wrap it in a promise
if (!p || (!(typeof p === "object" || typeof p === "function")) || typeof p.then !== "function") {
p = $.Deferred().resolve(p);
}
// Now we know for sure that p is a promise
// Make sure that the returned promise here is always resolved with a PromiseInspection object, never rejected
return p.then(function(val) {
return new PromiseInspection(true, val);
}, function(reason) {
// convert rejected promise into resolved promise
// this is required in jQuery 1.x and 2.x (works in jQuery 3.x, but the extra .resolve() is not required in 3.x)
return $.Deferred().resolve(new PromiseInspection(false, reason));
});
})).then(function() {
// return an array of results which is just more convenient to work with
// than the separate arguments that $.when() would normally return
return Array.prototype.slice.call(arguments);
});
}
然后,您可以使用它像这样:
$.settle(promiseArray).then(function(inspectionArray) {
inspectionArray.forEach(function(pi) {
if (pi.isFulfilled()) {
// pi.value() is the value of the fulfilled promise
} else {
// pi.reason() is the reason for the rejection
}
});
});
请记住,$.settle()
将始终满足(永不拒绝),并且履行的值是一个PromiseInspection
对象的数组,您可以询问每个对象以查看它是否被满足或拒绝,然后获取相应的值或原因。请参见下面的演示,例如使用:
工作演示:https://jsfiddle.net/jfriend00/y0gjs31r/
相关但不相同:?jQuery.when - 回调时,所有Deferreds不长“悬而未决”(解决或拒绝)( http://stackoverflow.com/questions/5824615/jquery-when-callback-for-when-all-deferreds-are-no-long-unresolved-either-r) – hippietrail 2012-08-16 12:23:14
我提出了另一项针对jQuery的功能请求对'$ .when()'的增强:** [用于$ .WHEN()的选项参数来提供备选语义](http://bugs.jquery.com/ticket/12325)**。它也关闭了,但[jaubourg](https://github.com/jaubourg)增加了很好的分析和建议,可以帮助任何对这个问题感兴趣的人。 – hippietrail 2012-08-17 12:26:01