Javascript forEach、async和回调

Javascript forEach、async和回调,javascript,ajax,callback,Javascript,Ajax,Callback,很抱歉,如果这个问题以前已经回答过,但我找不到它 我有一个对象数组,对于每个对象,我想进行一个异步调用(ajax调用),当所有异步调用完成后,我想调用另一个函数 例如 所有ajax调用完成后,我想调用函数load(final) 这可以通过回调实现,而不需要when.js等库吗 基本上,你会记录你打了多少电话,得到了多少回复,当你得到所有回复后,你会调用加载(最终)。在您的例子中,非常方便地有两个数组,并将基于第一个数组的调用结果推送到第二个数组中,以便比较它们的长度。(当然,您还需要处理错误情况

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

我有一个对象数组,对于每个对象,我想进行一个异步调用(ajax调用),当所有异步调用完成后,我想调用另一个函数

例如

所有ajax调用完成后,我想调用函数
load(final)

这可以通过回调实现,而不需要when.js等库吗


基本上,你会记录你打了多少电话,得到了多少回复,当你得到所有回复后,你会调用加载(最终)
。在您的例子中,非常方便地有两个数组,并将基于第一个数组的调用结果推送到第二个数组中,以便比较它们的长度。(当然,您还需要处理错误情况。)

您引用的代码有点可疑(我认为您想要
$。每个(列表,
),而不是
$(列表)。每个(…
),但我认为您的意思可能是这样的:

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);
      }
   });
});
var list=[Object,Object,Object,Object];
var final=[];
$。每个(列表、函数(数据){
//ajax调用

getSomething(data,function(result){/这是一种使用简单计数器解决问题的方法

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 */
        }
   });
});

当最后一项到达时调用函数:

final.push(data);
if (final.length == list.length) load(final);

由于jQuery看起来可用,因此可以使用jQuery中内置的承诺:

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);
});
与目前为止显示的所有其他方法相比,这种方法还有一个很好的优点,那就是它可以将结果保持在您要求的顺序上,即使它们没有按照该顺序返回


如果您想捕获任何ajax调用失败的情况,还可以提供
.fail()
的处理程序,除了
.done()
(或者用
指定两者)。然后(f1,f2)
)处理程序。

请记住,这并不保证
final
数组中结果的任何顺序(如果这很重要的话).lool…我现在觉得很愚蠢,没想到会有这么简单的解决方案。我,像这个解决方案,但我选择了一个更简单的解决方案。@zonelsk-只要你意识到你的数据不能保证与你选择的答案一致。是的,是的,我知道,但那不重要。Load函数对数据进行排序,所以这是一个好的简单解决方案。
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);
});