循环一堆异步操作并等待它们全部完成?
问题描述:
(请不要标记为重复或至少指向正确的答案,因为我在这里处理多个请求以形成一个数组)。我使用返回的“data”值作为数组设置了一些url调用。我打算使用这个数组来创建所有这些值的总和。循环一堆异步操作并等待它们全部完成?
var data_num=[];
$.each(arr_urls, function(index, value) {
$.getJSON(arr_urls[index], function (data) {
data_num.push(data);
});
});
alert(data_num);
答
你可能已经很熟悉为什么这并不工作,并有在an oft linked duplicate优秀的解释。不过,这不是完全是的重复。因为您不是这样问的:
如何从异步操作返回响应?
你问更多的东西是这样的:
如何遍历一群异步操作,等待他们全部完成?
为此,您首先需要将它们放入数组中。事情是这样的:
var my_promises = [];
var data_num = [];
$.each(arr_urls, function(index, value) {
my_promises.push($.getJSON(arr_urls[index], function (data) {
data_num.push(data);
}));
});
这应该给你打电话promises
数组持有到当前执行的异步操作的引用。现在你只需要等待他们完成。事情是这样的:
$.when.apply($, my_promises).then(function() {
alert(data_num);
});
本应适用的.when()
功能的承诺的整个阵列,只执行当整个阵列已完成回调。
答
我会假设你不能做那个服务器端(这将是最好的事情)。
好的,第一件事第一件:你为什么做$.getJSON(arr_urls[index]
?如果你想要做的使用$.each
,你应该使用value
,甚至更好:使用为循环
for (var i = arr_urls.length - 1; i >= 0; i--) {
arr_urls[i]
}
而且,你为什么不尝试做一个console.log(data)
看到JavaScript控制台对什么是返回?您的浏览器控制台甚至可以告诉您网站网址的请求是否有错误。
一旦你有足够的[声誉](http://*.com/help/whats-reputation)你将能够[评论任何职位](http://*.com/help/privileges/comment );相反,[提供不需要提问者澄清的答案](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- I-DO-代替)。 – Dethariel
对不起,我在这里还是很新的。仍然得到它的萦绕。但是,感谢您的链接,我会照顾。 –