【问题标题】:passing an array of jquery get requests into $.when() [duplicate]将一组 jquery get 请求传递给 $.when() [重复]
【发布时间】:2012-05-08 14:15:56
【问题描述】:

我有以下参数:

a = [{param:'a'}, {param:'b'}, {param:'c'}]

我想为每个参数发出一个 get 请求,如下所示:

a.map(function(ai){return $.get('myapi/get?ai='+ai.param)})

所有 get 请求完成后我该怎么做?

我尝试过使用 $.when,如下所示:

$.when(
    a.map(function(ai){return $.get('myapi/get?ai='+ai)})
)
.done(function(results){
    results.forEach(function(ri, i){
        ri.success(function(result){
            a[i].result = result
        }
    }
    do_something_with(a)
}

不幸的是,我显然误解了这个 $.when().done() 成语,因为当我调用 do_something_with(a) 时,我没有新的 .result 属性。我猜这是因为when 看到的是一个数组,所以直接进入.done(),而不是等待每个组件get 完成。

任何帮助将不胜感激!

【问题讨论】:

  • ri.success 应该是什么? ri 是 AJAX 调用返回的结果(或者,如果代码中没有其他错误,则返回结果),而不是延迟的/jqXHR 对象。

标签: javascript jquery


【解决方案1】:

你需要:

$.when.apply($, myArray);

即使用Function.apply 调用$.when()this === $,其余参数是数组myArray内容,其中该数组包含每次调用@987654326 返回的延迟对象@。


要回答 cmets 提出的第二个问题,您可以通过此 map 函数传递延迟对象数组,该函数返回延迟对象的 new 数组,该数组将在每次 AJAX 调用完成时解析,不管成功与否。

var alwaysDef = def.map(function(old) {
    var def = $.Deferred();
    old.always(def.resolve);
    return def;
});

请注意,在此实例中,我不确定最终会将哪些参数(如果有)传递给最终的 .done 函数。

如果这很重要,延迟对象总是按顺序调用,因此您可以为每个原始承诺注册一个 .done 处理程序,将 AJAX 结果存储在一个数组中以供以后使用,以及一个 .fail 处理程序而是存储 null 值。

这将确保您的最终 .when 处理程序在每个单独的结果可供您使用之后才会被调用。

【讨论】:

  • 这太快了!我在处理 .done() 中的响应时使用相同的技巧?
  • @MikeDewar in .done() 您需要使用 arguments 伪数组来检索响应数据 - 每个 AJAX 调用都有一个 AFAICR。
  • 在 done 回调中使用 console.log(arguments) 来查看参数包含的内容。它应该是一个对象数组或数组。
  • 如果一个或多个承诺失败,是否有一种方法不会非常介意?似乎 .done 和 .then 都对失败的响应非常敏感
  • @MikeDewar 是的 - 你必须为每个.always() .resolve() 的请求创建一个新的Deferred 然后只做你的事情.when() 那些延迟对象都是.done。 ;-)
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2015-08-27
  • 2020-01-10
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多