我有一个对象数组,对于每个对象,我想做一个异步调用(ajax调用),当所有异步调用完成后,我想调用另一个函数。
例如
var list = [Object, Object, Object, Object];
var final= [];
$(list).each(function(){
//ajax call
getSomething(data, function(data){
final.push(data);
});
});
完成所有ajax调用后,我想调用函数load(final);
这可以用回调来完成,没有像when.js等
这样的库的Th。
答案 0 :(得分:5)
当最后一个项目到达时调用该函数:
final.push(data);
if (final.length == list.length) load(final);
答案 1 :(得分:2)
由于看起来你有jQuery可用,你可以使用jQuery内置的promise:
var list = [Object, Object, Object, Object];
var promises = [];
$.each(list, function(){
//ajax call
promises.push($.get(data));
});
$.when.apply($, promises).done(function() {
// all ajax calls done
// data from each ajax call is in arguments[0], arguments[1], etc...
load(arguments);
});
这个mechansim与目前为止显示的所有其他优点的另一个好处是,这将使结果保持在您请求它们的顺序,即使它们没有以该顺序返回。
如果你想了解任何ajax调用失败的情况,你还可以向.fail()
提供.done()
的处理程序(或同时用.then(f1, f2)
指定)。
答案 2 :(得分:1)
这是一种用简单的计数器解决问题的方法
var counter = $(list).length;
$(list).each(function(){
$.get('URL', function(data){
/* do whatever you need for each list item */
if(--counter === 0){
/* Do whatever you wanted to do when all requests completed */
}
});
});
答案 3 :(得分:0)
从根本上说,您可以跟踪自己拨打了多少电话以及收到了多少回复,当您收到所有回复时,请拨打load(final)
。在你的情况下,很方便你有两个数组,并将基于第一个数组的调用结果推送到第二个数组,因此你可以比较它们的长度。 (当然,你也想要处理错误情况。)
您引用的代码有点怀疑(我认为您想要$.each(list, ...
,而不是$(list).each(...
),但我认为您可能意味着这样的事情:
var list = [Object, Object, Object, Object];
var final= [];
$.each(list, function(data){
//ajax call
getSomething(data, function(result){ // <= I used `result` rather than `data`; using the same symbol in intermixed code like this is asking for trouble
final.push(result);
if (final.length === list.length) {
// All done
load(final);
}
});
});