2016-08-02 42 views
-3

(请不要标记为重复或至少指向正确的答案,因为我在这里处理多个请求以形成一个数组)。我使用返回的“data”值作为数组设置了一些url调用。我打算使用这个数组来创建所有这些值的总和。循环一堆异步操作并等待它们全部完成?

var data_num=[]; 
$.each(arr_urls, function(index, value) { 

    $.getJSON(arr_urls[index], function (data) { 
     data_num.push(data); 
    }); 
}); 
alert(data_num); 

回答

1

你可能已经很熟悉为什么这并不工作,并有在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()功能的承诺的整个阵列,只执行当整个阵列已完成回调。

-1

我会假设你不能做那个服务器端(这将是最好的事情)。

好的,第一件事第一件:你为什么做$.getJSON(arr_urls[index]?如果你想要做的使用$.each,你应该使用value,甚至更好:使用循环

for (var i = arr_urls.length - 1; i >= 0; i--) { 
    arr_urls[i] 
} 

而且,你为什么不尝试做一个console.log(data)看到JavaScript控制台对什么是返回?您的浏览器控制台甚至可以告诉您网站网址的请求是否有错误。

+0

一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation)你将能够[评论任何职位](http://stackoverflow.com/help/privileges/comment );相反,[提供不需要提问者澄清的答案](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 – Dethariel

+0

对不起,我在这里还是很新的。仍然得到它的萦绕。但是,感谢您的链接,我会照顾。 –