等待所有异步ajax调用完成deferred.when()。then(),then()中的任务没有被调用

时间:2015-10-28 05:14:11

标签: javascript jquery ajax

我有以下方法进行ajax调用,并且此方法从另一个函数多次调用,因此最终会进行多个ajax异步调用。我需要在所有异步ajax调用完成后才执行某些任务。

var makeAjaxCall = function() {
var ret = new $.Deferred();
$.ajax({
      type: 'GET',
      url: url,
      dataType: 'json'
    })
    .done(function(data, textStatus, jqXHR) {
      //do stuff
      ret.resolve(data);
    })
    .fail(function(jqXHR, textStatus) {
     // do stuff
    })
    .always(function() {
      //do stuff
    });

    return ret;
  };

此函数从for循环遍历对象的for循环中调用。

var items = ['a', 'b', 'c'];

  for (var i = 0; j < items.length; j++) {
    makeAjaxCall();
}

现在我正在执行等待所有触发的ajax调用完成的任务。

$.when(makeAjaxCall()).then(function(ret) {
        // perform the task
      });

问题是,deferred.when()中的'then'部分没有被调用,并且没有执行该任务。我错过了什么?

1 个答案:

答案 0 :(得分:0)

$.ajax已经返回成功完成时解析的promise,因此您不需要额外的延迟。只需return $.ajax

最重要的是$.when接受可变参数 - 所有延迟,但不是数组。如果要使用数组,则必须使用.apply

var arrayOfPromises = items.map(item => {
    // Do you need to pass in `item` or something?
    return makeAjaxCall();
});
$.when.apply($, arrayOfPromises).then(() => {
    // perform task
});