jquery '$.when':即使在出错的情况下如何触发'done'回调
jquery '$.when': how to trigger 'done' callback even in case of error
Jquery的$.when
函数在解析所有承诺时执行'done'回调,但如果其中任何一个导致错误,则不执行。一旦所有承诺都有结果,我该如何执行"完成"回调,无论是success
还是error
?
Jquery 的 $.when 函数在解析所有承诺时执行"done"回调,但如果其中任何一个导致错误,则不会执行。
请允许我用更准确的术语重新表述这一点。
jQuery的$.when
接受承诺1的列表并返回一个新的承诺。当所有这些承诺都实现时,新承诺就会实现,或者当任何这些承诺被拒绝时,这个新承诺就会实现。
你正在寻找的函数叫做"Settle",在jQuery的promise实现中不可用 - 幸运的是我们可以很容易地添加它。
策略是:
- 显式创建新承诺。
- 保持计数器从
n
开始 - 参数的数量。 - 对于每个参数:
- 如果不是承诺,请立即分配它并减少计数器。
- 如果是承诺,请等待它解决,然后递减计数器。
- 当计数器达到 0 时,解决承诺。
$.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 中的承诺(
相关文章:
- 如何在没有回调的情况下获取有关元素的信息
- 在没有大量回调函数的情况下在列表元素上循环播放同一动画
- 如何在没有空回调的情况下测试多个调用
- ReactJs:this.setState的情况下不调用回调函数
- 如何在Angular中设置异步HTTP服务的回调,以便在不定义数组的情况下在控制器中填充数组
- 如何在不向现有JavaScript函数添加代码的情况下向该函数添加回调函数
- 返回按钮回调函数在特定情况下失败或未启动
- 在这种情况下,如何使用参数添加回调
- 未定义的返回值.在这种情况下如何使用回调
- 在什么情况下浏览器拒绝继续调用 setInterval 回调
- 如何在不传递回调函数的情况下将嵌套对象属性作为选项传递
- 在没有回调的情况下链接多个jquery事件
- 如何在不触发模型生命周期回调的情况下更新SailsJS中的记录
- 如何在不回调的情况下从SDK请求返回值
- 在这种情况下如何实现回调函数
- jquery '$.when':即使在出错的情况下如何触发'done'回调
- 在没有回调的情况下在ajax加载后启动jQuery脚本
- 如何在不执行回调函数的情况下将参数传递给回调函数
- jQuery:如何在不丢失默认参数的情况下为回调函数添加参数
- 是否可以在不创建全局回调函数的情况下异步初始化Google Maps ?