forEach,async和callbacks

时间:2014-05-03 15:39:32

标签: javascript ajax callback

抱歉,如果之前已经回答过这个问题,但我找不到。

我有一个对象数组,对于每个对象,我想做一个异步调用(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。

4 个答案:

答案 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);
      }
   });
});