3

我有一个 for 循环语句,每个循环都会执行一个 ajax 调用。

$.each(arr, function(i, v) {
    var url = '/xml.php?id=' + v;
    $.ajax({
        url: url,
        type: 'GET',
        dataType: 'xml',
        success: function(xml) {
            if ($(xml).find('Lists').attr('total') == 1) {
                // some code here
            }
        },
        complete: function() {
            // some code here
        }
    })
})

我想在循环下完成所有ajax调用后运行代码,我试图将下面的代码放在最后一行,当ajax调用完成时它不会执行

    if (i == arr.length - 1) {
        // some code here
    }

因此,如果我有 10 次循环,就有 10 次 ajax 调用。我想在完成 10 次 ajax 调用后运行代码,有什么想法吗?

是使用更好.ajaxComplete()还是.done()实现更好?

谢谢

4

2 回答 2

13

尝试使用$.when()

var arr = [];
$.each(arr, function(i, v) {
    var url = '/xml.php?id=' + v;
    var xhr = $.ajax({
        url: url,
        type: 'GET',
        dataType: 'xml',
        success: function(xml) {
            if ($(xml).find('Lists').attr('total') == 1) {
                // some code here
            }
        },
        complete: function() {
            // some code here
        }
    });
    arr.push(xhr);
})

$.when.apply($, arr).then(function(){
    console.log('do')
})
于 2013-06-06T07:30:06.453 回答
0

我遇到了类似的情况,但在循环内部,AJAX 调用是在另一个函数调用(称为 fetchData)中完成的。

所以我让 fetchData 函数返回一个来自 AJAX 调用的Promise ,并使用then子句链接它以处理响应。

这是Plunker 链接

$(document).ready(function() {
  var message = '';

  process();

  function process() {
    var promises = [];
    for (var i = 0; i < 3; i++) {
      var promise;
      (function (index) {
        promise = fetchData(index).then(function (response) {
          // do something with the response.
          message += 'Iteration ' + index + '\n';
        });
      })(i);

      promises.push(promise);
    }

    $.when.apply($, promises).then(function () {
      // do something after all the AJAX calls are completed.
      alert(message);
    });
  }

  function fetchData(param) {
    return $.ajax('data.json')
      .success(fetchDataSuccess)
      .error(fetchDataFailed);

    function fetchDataSuccess(response) {
      return response;
    }

    function fetchDataFailed(error) {
      console.error(error);
    }
  }
});
于 2017-04-03T10:35:30.523 回答