我正在尝试了解有关Ajax调用的更多信息并进行一些测试。由于异步,我遇到了麻烦。在this website的帮助下,我发现了我认为应该起作用的东西。我已经摆弄了很多东西,但是仍然没有使事情按照我的喜好工作。

背景:


array中捕获可变数量的id
遍历$.ajax调用以更新ID(无法进行api批处理请求)。




$(document).ready(function() {
  $("#button").click(function() {
    var deffered, deferreds = [];
    $.each(arr, function(i, array) {
      deferred = $.ajax({ ...
        success: function(data) {console.log('complete');},
        error: function(data) {...}
      });
      deferreds.push(deferred);
    });
    $.when.apply($, deferreds).done(console.log('done'));
  });
});


当运行上面的代码(更多信息请参见fiddle)并检查我的console.log时,它表明在完成任何“完成”之前发生了“完成”(下图)。

请帮助我了解代码有什么问题。我希望在console.log('complete')之前所有对console.log('done')的ajax调用。据我了解,这是$.when.apply的重点。

最佳答案

我添加了示例工作代码。请在每个请求中添加承诺

deferred = $.ajax({ ...
        success: function(data) {console.log('complete');},
        error: function(data) {...}
      }).promise();


并改变这一行

 $.when.apply(this, deferreds)


请运行此代码并进行验证



function doSomething() {
  var arrDef = [];
  for (var i = 0; i < 2; i++) {
  var deferred = $.ajax({
        url:"https://jsonplaceholder.typicode.com/todos/1",
        type: "GET",
        contentType: "application/json;odata=verbose",
        success: function(data) {
          console.log('complete');
        },
        error: function(data) {
          console.log('fail');
        }
      }).promise();

    arrDef.push(deferred);
  }
  return arrDef;
}

  var getters = doSomething();
  // use apply to call $.when
  $.when.apply(this, getters).then(function() {
    console.log('Final complete');
    // correctly writes out all responses
  });

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

关于javascript - 进行多个AJAX调用$ .when.apply($,array)不能正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58859120/

10-12 12:31
查看更多