【发布时间】:2014-11-07 17:16:48
【问题描述】:
Jquery 的$.when 函数在所有承诺都解决时执行“完成”回调,但如果其中任何一个导致错误则不执行。一旦所有的承诺都有结果,我如何执行“完成”回调,success 或 error?
【问题讨论】:
标签: javascript jquery promise .when
Jquery 的$.when 函数在所有承诺都解决时执行“完成”回调,但如果其中任何一个导致错误则不执行。一旦所有的承诺都有结果,我如何执行“完成”回调,success 或 error?
【问题讨论】:
标签: javascript jquery promise .when
Jquery 的 $.when 函数在所有 promise 都解决时执行“done”回调,但如果它们中的任何一个导致错误则不会。
请允许我用更准确的术语重新表述。
jQuery 的$.when 接受一个promise 列表1 并返回一个新的promise。当所有这些承诺都实现时,新的承诺实现,或者当其中任何一个承诺被拒绝时拒绝。
你正在寻找的函数叫做“Settle”,在 jQuery 的 Promise 实现中不可用 - 幸运的是我们可以轻松添加它。
策略是:
n - 参数的数量。$.settle = function(promises){
var count = arguments.length; // how many we'll have to wait for
var d = $.Deferred(); // the new deferred - representing the return value
var results = []; // what we'll end up resolving with
$.map(arguments, function(arg, i){
if(typeof arg.then !== "function"){ // it's not a promise!
results[i] = {status:"fulfilled", value: arg};
count--; // and we don't have to wait for it
} else {
arg.then(function(value){
results[i] = {status:"fulfilled", value: value };
count--;
if(count === 0) d.resolve.apply(d, results); // resolve promise
}, function(e){
results[i] = {status:"rejected", reason: e };
count--;
if(count === 0) d.resolve.apply(d, results); // resolve promise
});
}
})
return d.promise(); // return a promise over the deferred
}
上面的用法应该是这样的:
$.settle($.get("firstUrl"),$.get("secondUrl")).then(function(firstResult, secondResult){
// access results here, values are in firstResult.value
// and you can tell if it rejected or fulfilled in firstResult.status
);
我不是这里语义的忠实拥护者 - 但我试图让它们尽可能接近 jQuery 的 $.when 语义。
(1. 或者在 jQuery 中也是 promise 的 deferreds)
【讨论】: