Javascript:在所有异步调用返回后调用函数

时间:2015-11-06 07:16:59

标签: javascript jquery

在我的项目中,数据分布在表组中。为了读取数据,我需要为这些组(1 ... groupCount)中的每个组Async call

在成功读取每个组中存在的所有数据后,我需要调用另一个函数。这样做的最佳方式是什么?

function getData() {

    for(var gc = 1; gc < groupCount; gc++)
        readDataFromAsync(gc);

}

2 个答案:

答案 0 :(得分:2)

假设readDataFromAsync返回一个jQuery延迟对象

使用jQuery.when()并在完成所有操作后传递回调。

function getData() {
  var promises = [];
  for (var gc = 1; gc < groupCount; gc++) {
    promises.push(readDataFromAsync(gc));
  }
  $.when.apply(undefined, promises).done(function(/*...*/) {
    // your code
  });
}

答案 1 :(得分:0)

首先,多次调用AJAX是一种不好的做法,比如在循环内部。 如果您可以组合所有呼叫并一次发送所有请求,并一次收回所有响应,那么这将是最好的方法。为此,您还需要更新服务器端代码。

但总是不可能,并且根据情况你需要像这样打电话。

以下是一些替代方案。 使用async异步调用如下

jQuery.ajax({
    url: '.....',
    success: function (result) {
        //.....
    },
    async: false
});

但是它会很慢,因为1比1的呼叫是存在的,而不是一个好的做法。

因此,您可以将ajaxResponse计为成功或不成功响应的变量,并在ajaxResponse达到其上限时调用最终方法,如下所示。

var ajaxResponse  = 0;
function getData() {
    ajaxResponse= 0;
    for(var gc = 1; gc < groupCount; gc++)
        readDataFromAsync(gc);
}
function readDataFromAsync(gc) {
     $.ajax(...).success() {
       //Your current code
       ajaxResponse++;
       if(ajaxResponse>=groupCount){
             finalCall();
       }
     }
}

但是上述方法也存在问题。处理ajaxResponse计数器很困难,并且可能在ajax调用上发生错误。

您还可以尝试setInterval和clearInterval,如果在成功方法中放置一个,但是它也会很昂贵。 最后一个但最好的是@Li Yin Kong提供的方法如下。

function getData() {
  var promises = [];
  for (var gc = 1; gc < groupCount; gc++) {
    promises.push(readDataFromAsync(gc));
  }
  $.when.apply(undefined, promises).done(function(/*...*/) {
    // your code
  });
}