Javascript 将jquery get请求数组传递到$.when()中

Javascript 将jquery get请求数组传递到$.when()中,javascript,jquery,Javascript,Jquery,我有以下参数: a = [{param:'a'}, {param:'b'}, {param:'c'}] 我想对每个参数发出get请求,如下所示: a.map(function(ai){return $.get('myapi/get?ai='+ai.param)}) $.when( a.map(function(ai){return $.get('myapi/get?ai='+ai)}) ) .done(function(results){ results.forEach(fu

我有以下参数:

a = [{param:'a'}, {param:'b'}, {param:'c'}]
我想对每个参数发出get请求,如下所示:

a.map(function(ai){return $.get('myapi/get?ai='+ai.param)})
$.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)
}
一旦所有get请求完成,我该如何做

我尝试过使用$。当,像这样:

a.map(function(ai){return $.get('myapi/get?ai='+ai.param)})
$.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()
习惯用法,就像我用(a)调用
做某事一样,我没有新的
.result
属性。我猜这是因为当
看到单个数组时,直接进入
.done()
,而不是等待每个组件
获取
完成

任何帮助都将不胜感激

您需要:

$.when.apply($, myArray);
i、 e.使用
函数。应用
调用
$.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
处理程序在每个单独的结果对您可用之前不会被调用。

太快了!在
中处理.done()?@mikedevar中的响应时,我使用了相同的技巧
.done()
您需要使用
参数
伪数组来检索响应数据-每个AJAX调用一个响应数据。使用done回调中的console.log(参数)查看参数包含什么。它应该是一个对象数组或数组。有没有一种方法不介意一个或多个承诺失败?似乎。完成和。然后都对失败非常敏感response@MikeDewar是-您必须为您的每个请求创建一个新的
延迟的
。始终()
.resolve()
,然后只执行
这些延迟的对象都是
.done
;-)成功应该是什么
ri
是AJAX调用返回的结果(或者如果没有代码中的其他错误,则返回的结果),而不是延迟的/
jqXHR
对象。