【问题标题】:jquery '$.when': how to trigger 'done' callback even in case of errorjquery'$.when':即使发生错误,如何触发'done'回调
【发布时间】:2014-11-07 17:16:48
【问题描述】:

Jquery 的$.when 函数在所有承诺都解决时执行“完成”回调,但如果其中任何一个导致错误则不执行。一旦所有的承诺都有结果,我如何执行“完成”回调,successerror

【问题讨论】:

标签: javascript jquery promise .when


【解决方案1】:

Jquery 的 $.when 函数在所有 promise 都解决时执行“done”回调,但如果它们中的任何一个导致错误则不会。

请允许我用更准确的术语重新表述。

jQuery 的$.when 接受一个promise 列表1返回一个新的promise。当所有这些承诺都实现时,新的承诺实现,或者当其中任何一个承诺被拒绝时拒绝

你正在寻找的函数叫做“Settle”,在 jQuery 的 Promise 实现中不可用 - 幸运的是我们可以轻松添加它。

策略是:

  • 明确地创建一个新的承诺。
  • 保持一个计数器开始于n - 参数的数量。
  • 对于每个参数:
    • 如果不是 Promise,则立即分配它并减少计数器。
    • 如果它是一个承诺,请等待它解决,然后递减计数器。
  • 当计数器达到 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 中也是 promise 的 deferreds)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2017-04-01
    • 2014-11-22
    • 2018-12-23
    • 2011-09-29
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多