jQuery延迟数组没有按预期触发.done()

jQuery deferred array not triggering .done() as expected

本文关键字:done 数组 延迟 jQuery      更新时间:2023-09-26

我在使用jQuery延迟时有一些麻烦。下面是我的代码:

function makeAjaxCalls(purge){
  var deferreds = [];
  // delete the documents
  _.each(purge, function(element, index, list){
    console.log('purging '+element.model+' id='+element.id);
    deferreds.push(
      $.ajax({
        type: 'DELETE',
        url: '/API/admin/purge/'+element.model+'/'+element.id
      })
    );
  });
  console.log('returning array with '+deferreds.length+' deferreds');
  return deferreds;
};
function purgeDeletedDocs(){
  console.log('purging...');
  var purge = [];
  _.each(arrayOfIDs, function(element, index, list){
    purge.push({'model': arrayOfModels.get(element).get('modelName'), 'id': element});
  }); // [{model: 'modelName', id: 'id'}...]
  // when *all* the AJAX calls are resolved run this code
  $.when.apply(this, deferreds).done(function(){
    console.log('done');
  });
  var deferreds = makeAjaxCalls(purge);
};
purgeDeletedDocs()

正如你所看到的,我使用$.when.apply,因为我从makeAjaxCalls()函数返回一个延迟数组。

这是我在控制台得到的内容:

purging...
done
purging User id=5564e0f647f054512a9d64c9
purging Client id=557079a04407058a49fd2f3d
returning array with 2 deferreds

这很奇怪。在AJAX调用完成之前,我就看到了done,更不用说解决了。我将this传递到apply(),但使用$等没有区别-并且阅读apply()的文档,第一个参数只是为代码设置this,因此这是预期的行为。

服务器正在正确地获得API调用,因此AJAX调用正在进行,只是多个延迟似乎在它们甚至被制作之前就解决并触发.done()

你知道我做错了什么吗?

// when *all* the AJAX calls are resolved run this code
$.when.apply(this, deferreds).done(function(){
    console.log('done');
});
var deferreds = makeAjaxCalls(purge);

正如你所看到的,我正在使用$.when.apply,因为我正在返回一个数组从makeAjaxCalls()函数延迟。

嗯,但是你没有把它们传递给$.when函数。相反,您将undefined传递给$.when,甚至在调用makeAjaxCalls()之前!

重新排序语句到

var deferreds = makeAjaxCalls(purge);
$.when.apply(this, deferreds).done(function(){
    console.log('done');
});