【问题标题】:Get response of multiple deferred objects in jquery在jquery中获取多个延迟对象的响应
【发布时间】:2015-04-23 07:08:37
【问题描述】:

以下是我的多个带有承诺的 ajax 调用。

$(window).load(function(){
 $.when(getApiModemList()).done(function(vendors){

    var deferreds = calculateApiBalances(vendors);

    $.when.apply($,deferreds).done(function(balance) {
     console.log(balance);
     console.log("All Done");
    });

});


function getApiModemList(){
   return $.getJSON("url");
}

 function calculateApiBalances(vendors)
  {
   var defer=[];
   $.each(vendors,function(k,v){
    defer.push($.getJSON(someurl));
   });
  return defer;
 }

 });

函数 calculateApiBalances() 返回一些余额,我需要对其进行汇总以获得所有余额的总数。 但是当打印 console.log(balance) 时,它没有为我提供有效的 balance json 数组。 另一个问题是,如果我在 calculateApiBalances() 中的任何一个 ajax 调用失败,它不会打印 All Done。 在上面的代码中应该做些什么来实现这一点。

【问题讨论】:

  • 如果出现错误,数组应该包含什么?通常,加入的 Promise 会被简单地拒绝。
  • @Bergi 。修复了 anitpattern 问题。我不在乎某些 ajax 调用是否失败我只需要考虑成功 ajax 调用的平衡。有可能吗?

标签: javascript jquery ajax promise jquery-deferred


【解决方案1】:

但是当打印 console.log(balance) 时,它没有为我提供有效的 balance json 数组。

这是$.when 的奇怪之处。它不为您提供数组,而是使用多个参数调用您的回调。

另一个问题是,如果我在 calculateApiBalances() 中的任何一个 ajax 调用失败,它不会打印 All Done。

是的,因为当一个承诺失败时,整个$.when() 承诺会立即被拒绝,并且您没有任何错误处理程序。如果您想始终获得一个数组(可能是无效响应),则必须单独捕获错误。另见$.Deferred: How to detect when every promise has been executed

在上面的代码中应该做些什么来实现这一点。

首先,avoid the deferred antipattern :-)

$(window).load(function() {
    getApiModemList().then(calculateApiBalances).then(function() {
        var balance = Array.prototype.slice.call(arguments);
        console.log(balance);
        console.log("All Done");
    });
});


function getApiModemList() {
    return $.getJSON(somurl).then(function(res) {
        return res.data;
    });
}

function calculateApiBalances(vendors) {
    return $.when.apply($, $.map(vendors, function(v, k) {
        return $.getJSON(someurl).then(null, $.when);
    }));
}

漫游者编辑:

这是一个主例程的版本,其中包含一种对余额求和的机制。

    getApiModemList().then(calculateApiBalances).then(function() {
        var sumOfBalances = Array.prototype.reduce.call(arguments, function(tot, obj) {
            return tot + (+obj.balance || 0);
        }, 0);
        console.log(sumOfBalances);
        console.log("All Done");
    });

obj$.getJSON(someurl)calculateApiBalances()中承诺的对象。在出现$.getJSON() 错误的情况下,obj 将是一个 jqXHR 对象,obj.balance 将是undefined+obj.balance 将是NaN,因此默认添加零;否则添加obj.balance

如果您想知道有多少 getJSON 请求是成功的,有多少是不成功的,那么还有一些代码要写,但不是很多。

【讨论】:

  • @Roamer:啊,我错过了这个要求,感谢您编辑它。但是您的编辑处于合法性的边缘,我该如何投票? :-)
  • Bergi,“合法性的边缘”?
  • 抱歉,这里是非母语人士。我的意思是编辑是临界的,并且可能不会被接受为编辑建议(“太剧烈的变化”,“尝试回复”)。不过我很好,谢谢。
  • Bergi,有趣的是,如果您退出 SO(或在电子邮件客户端中获取 RSS 提要),“编辑”链接显示为“改进此答案”,这似乎会邀请此类编辑。顺便说一句,我一直认为英语是你的第一语言 :-)
  • 哦,谢谢。是的,我不介意这样的编辑,有时我会自己做,但我只是不常看到它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多