0

我有以下参数:

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

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

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

一旦所有的获取请求都完成了,我该怎么做?

我尝试过使用 $.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完成。

任何帮助,将不胜感激!

4

1 回答 1

2

你需要:

$.when.apply($, myArray);

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


要回答您评论中的第二个问题,您可以通过此 map 函数传递您的延迟对象数组,该函数返回一个的延迟对象数组,无论它是否成功,都将在每次 AJAX 调用完成时解析该数组。

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

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

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

这将确保在您.when获得每个单独的结果之前不会调用您的最终处理程序。

于 2012-04-27T20:19:37.937 回答