How can I use the results of ajax calls, made inside a loop, after that loop?
本问题已经有最佳答案,请猛点这里访问。
我已经阅读了有关延期和承诺的内容,但我仍然不知道如何管理它。
1 2 3 4 5 | for(...){//we don't know the number of ajax calls $.ajax({...}); } if(all the ajax call we made are done){...} |
关键是我需要保持"ajax.async = true"。
传统方式:
解决这个问题的传统方法是将promise添加到数组中,然后使用
1 2 3 4 5 6 7 | 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/
使用返回值:
由于您希望保留这些值,因此可以使用
1 2 3 4 5 6 7 8 9 10 | 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/
笔记:
- 值按调用的顺序返回,而不是完成顺序。
其他方法
我找到的小技巧:你可以与
1 2 3 4 5 6 7 | 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对象,并且在末尾传递的任何参数都不是很有用(因为它们在其他对象中递归嵌套)。如果您不需要参数,则简短而简单。
您将在下面的小提琴中注意到结果是嵌套的,并且以您想要的相反顺序。同样,这种技术仅在您不需要promises的结果时才有用(这通常用于并行操作)。
简介:
JSFiddle:http://jsfiddle.net/TrueBlueAussie/rgj0bx95/9/