进行多次 AJAX 调用 $.when.apply($, array) 无法正常工作

Making multiple AJAX calls $.when.apply($, array) not working properly

我正在尝试了解有关 ajax 调用的更多信息并进行一些测试。由于异步,我 运行 陷入了困境。在 this website 的帮助下,我找到了我认为应该有效的东西。不知何故,事情仍然 运行 不正确。我摆弄了很多东西,但仍然没有让事情按照我喜欢的方式工作。

背景:

  1. array
  2. 中捕获可变数量的 ID
  3. 通过 $.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 它显示 'done' 发生在任何 'completes' 之前(下图)

请帮助我理解代码有什么问题。我希望在 console.log('done') 之前对 console.log('complete') 的所有 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>