我如何在循环内进行ajax调用后,在循环外使用结果?

12 浏览
0 Comments

我如何在循环内进行ajax调用后,在循环外使用结果?

这个问题已经有了答案:

等待所有的jQuery Ajax请求完成?

我已经阅读了关于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\"。

admin 更改状态以发布 2023年5月22日
0
0 Comments

传统的方式:

解决这个问题的传统方式是将这些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("");
    }
});

范例:

以下示例使用一个简单的函数来返回一个promise,使用计时器来模拟ajax调用。它清楚地展示了建议即使在"随机"顺序完成承诺时也可以工作(仅用于演示):

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

说明:

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

其他方法

我发现的小技巧:您可以使用$.when并行链接承诺,而无需使用一组承诺:

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 = promise.then(newpromise)
  • 缺点是它在幕后创建额外的promise对象,并且最后传递的任何参数都不是非常有用(因为它们被递归嵌套在其他对象中)。如果您不需要这些参数,那么它会变得简短而简单。

您将在以下fiddle中注意到结果是嵌套的,并且以
您希望的相反的顺序。再次强调,如果您不想要承诺的结果(这很常见),那么这种技术才有用。

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

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

0