【问题标题】:How can I use the results of ajax calls, made inside a loop, after that loop? [duplicate]如何在循环之后使用在循环内进行的 ajax 调用的结果? [复制]
【发布时间】:2015-11-26 20:20:46
【问题描述】:

我读过一些关于 deferred 和 promises 的文章,但我仍然不知道如何管理它。

for(...){//we don't know the number of ajax calls
   $.ajax({...});
}

if(all the ajax call we made are done){...}

关键是我需要保持“ajax.async = true”。

【问题讨论】:

  • 因为不敢建议async: false +1.. 这样是阴暗面.
  • @Bergi:值得注意的是,您选择的重复问题(用于结束此问题)不是与此问题非常匹配。您需要选择一个请求可变数量的承诺,而不仅仅是多个承诺。
  • @TrueBlueAussie:实际上,被骗者接受的答案有一段“如果你事先不知道你需要等待多少个 ajax 参数......”。但你说得对,我可能应该直接选择How do you work with an array of jQuery Deferreds?

标签: javascript jquery ajax promise deferred


【解决方案1】:

传统方式:

解决这个问题的传统方法是将 Promise 添加到数组中,然后使用 $.when.apply 一起评估它们

var promise = [];
for (var i = 0; i < 6; i++){
    promise.push(delay(10-i, $('#' + i)));
}
$.when.apply($, promise).done(function(){
    alert("All done");
});

JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/1/

使用返回值:

如果您想保留这些值,您可以使用 arguments 数组访问它们:

var promise = [];
for (var i = 0; i < 6; i++){
    promise.push(delay(6-i, $('#' + i)));
}
$.when.apply($, promise).done(function(){
    $('body').append("All done!");
    for (var i = 0; i < arguments.length; i++){
        $('body').append(arguments[i]).append("<br/>");
    }
});

示例:

以下示例使用一个简单的函数,该函数使用计时器返回一个 Promise 来模拟 ajax 调用。即使承诺以“随机”顺序完成(只是为了演示),它也清楚地表明建议有效:

JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/5/

注意事项:

  • 返回值的顺序是调用的顺序,而不是完成顺序。

其他方法

我发现的小技巧:您可以将 Promise 与 $.when 并行链接,而无需使用 Promise 数组:

var promise;   // Undefined also means a resolved promise to $.when
for(...){//we don't know the number of ajax calls
   promise = $.when(promise, $.ajax({...}));
}
promise.done(function(){
   alert("All done");
});

注意事项:

  • 在看到有人按顺序使用promise = promise.then(newpromise) 进行承诺后,我发现了这一点
  • 缺点是它在幕后创建了额外的 Promise 对象,并且最后传递的任何参数都不是很有用(因为它们递归地嵌套在其他对象中)。如果您不需要这些参数,那么它很简短。

您将在下面的小提琴中注意到结果是嵌套的,并且按照您想要的相反顺序排列。同样,此技术仅在您想要 promise 的结果时才有用(这通常用于并行操作)。

总结:$.when 技术仅在您不关心结果值时才有用。

JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/9/

【讨论】:

  • 那么您的解决方案是按顺序运行 ajax 调用?
  • 哦,我将$.when 误读为$.then - 我的错误(认为$.then 是承诺规范的更多jQuery 混蛋) - 问题问我怎么能使用结果 ajax 调用 - 似乎你的解决方案抛弃了所有结果
  • @JaromandaX:添加了包括处理可变数量结果的答案。
  • 只有一个问题:你为什么使用delay()函数?有什么用?也许是为了模拟几个 ajax 调用,对不起伙计。谢谢。
  • 我认为错误是arr= arguments[0];,应该是arr= arguments;。使用promise = $.when(promise, undefined); 是一种非常奇怪的解决方法……
猜你喜欢
  • 2017-05-16
  • 2021-05-05
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多