我有以下参数:
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完成。
任何帮助都将不胜感激!
发布于 2012-04-28 04:19:38
您需要:
$.when.apply($, myArray);例如,使用Function.apply调用带有this === $的$.when(),其余参数是数组myArray的内容,其中该数组包含每次调用$.get返回的延迟对象。
要回答注释中的第二个问题,可以通过此map函数传递延迟对象数组,该函数返回一个新的延迟对象数组,该数组将在每次AJAX调用完成时解析,无论调用是否成功。
var alwaysDef = def.map(function(old) {
var def = $.Deferred();
old.always(def.resolve);
return def;
});请注意,我不确定在这个实例中,哪些参数(如果有的话)最终将被传递给最终的.done函数。
如果这很重要,延迟对象总是按顺序调用的,所以您可以为每个原始promises注册一个.done处理程序,该处理程序将AJAX结果存储在一个数组中供以后使用,并注册一个.fail处理程序来存储一个null值。
这将确保在每个单独的结果可用之前不会调用最终的.when处理程序。
https://stackoverflow.com/questions/10357284
复制相似问题