【问题标题】:jQuery deferred array not triggering .done() as expectedjQuery 延迟数组未按预期触发 .done()
【发布时间】:2015-06-10 15:57:41
【问题描述】:

我在使用 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(),甚至在它们完成之前。

关于我做错了什么有什么想法吗?

【问题讨论】:

  • 你似乎在打电话给makeAjaxCalls(purge)你打电话给$.when.apply($, deferreds)?
  • 你对 deferreds 的定义出现在 when 这意味着承诺立即解决 - 这意味着它在 akeAjaxCalls(purge) 发出实际请求之前被调用;

标签: javascript jquery ajax jquery-deferred


【解决方案1】:
// 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');
});

【讨论】:

  • 谢谢伯吉。 facepalm 今天我盯着屏幕太久了……木头、树木等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2016-10-22
  • 2011-07-23
相关资源
最近更新 更多