【问题标题】:$.when.apply.done not executing asynchronous functions$.when.apply.done 不执行异步函数
【发布时间】:2015-01-29 09:08:26
【问题描述】:

在所有异步函数执行完毕后,我必须执行一个回调函数。
为此,我创建了一个包含异步函数的数组:

var funcs = [];
var requests = [];

我在其中推送了一些 ajax 函数。

这是我的解决方案,但不起作用:

for(i = 0; i < functions.length; i++){
  var f = functions[i](); //calling each ajax functions
  requests.push(f);
}    
$.when.apply(null, requests).done(function(){
    console.log("Hello");
});

现在函数正在异步执行,但回调函数在函数执行完成之前被调用。

我推送的ajax函数示例之一:

functions.push(function () {
  return $.ajax({
    url: "some url",
    success: function(){
    console.log("Finished execution");
  }
});

【问题讨论】:

  • 你应该将$.ajax()返回的承诺转发给你的调用者。换句话说,return $.ajax({ /* ... */ });。另请注意,您问题中的代码包含语法错误。
  • 1.代码有错误。 2.尝试在函数中$.ajax之前添加console.log( "Function called" );
  • 编辑修复了您没有调用函数的事实,但您仍然需要按照@FrédéricHamidi 的建议进行操作,并在示例函数中返回$.ajax 的结果。
  • 现在函数正在运行,但是在所有函数完成执行之前,首先调用回调函数,而不是最后调用。
  • @rohinichaudhary 请将新代码添加到您的问题中(不要删除旧代码),以便我们看到您现在拥有的内容。

标签: javascript jquery ajax asynchronous .when


【解决方案1】:

你的匿名函数没有return,所以它的有效返回值是undefined

因此,首先您需要修复匿名函数以包含 return

functions.push(function() {
     return $.ajax(...);
});

您还可以更简洁地实现调用循环:

var requests = functions.map(function(f) {
    return f();
});

$.when.apply($, requests).done(callb);

【讨论】:

  • 我用了return,还是一样的问题。现在正在执行 ajax 函数。但.done 不是。
  • 是的,在添加return 之后,代码稍作改动,现在可以正常工作了。感谢大家的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2021-09-27
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
相关资源
最近更新 更多