控制AJAX请求

时间:2015-07-17 15:15:44

标签: javascript jquery ajax

是否还有停止其他AJAX请求并一次解雇一个?我有一个打印应用程序,所以我需要处理每个请求,然后再继续下一个。在我的代码中,我有一个循环迭代平均约15次,这将使每个迭代的AJAX调用并处理响应$.when()准备就绪。问题是每个响应在返回时都会得到处理,而不是在前一个响应完成时。我真的试图避免让我的呼叫同步,但无论如何都要一次处理这些响应?

1 个答案:

答案 0 :(得分:1)

是的,将promise存储在原始数组中,然后再次遍历原始数组以传递给$ .when。回调将按顺序包含参数。

var myData = [
  {
    name: 'apple',
    color: 'red'
  },
  {
    name: 'orange',
    color: 'orange'
  }
];

myData.forEach(function (obj) {
  obj.promise = $.get('/object-info', obj);
});

$.when.apply($, myData.map(function (obj) {
  return obj.promise;
})).then(function () {
  var args = Array.prototype.slice.call(arguments);
  args.forEach(function (result) {
    console.log(result); // results in order
  })
});

// *** MOCK

$.get = function (url, data) {
    var defer = $.Deferred()
    setTimeout(function () {
        defer.resolve(data.color);
    }, 1500);
    return defer.promise();
};

// *** END MOCK

var myData = [
  {
    name: 'apple',
    color: 'red'
  },
  {
    name: 'orange',
    color: 'orange'
  }
];

myData.forEach(function (obj) {
  obj.promise = $.get('/object-info', obj);
});

$.when.apply($, myData.map(function (obj) {
  return obj.promise;
})).then(function () {
  var args = Array.prototype.slice.call(arguments);
  args.forEach(function (result) {
    console.log(result); // results in order
  })
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>