jQuery - 当你需要等待所有数据时,在循环中调用getJSON的最佳方法?

Mit*_*ell 4 ajax jquery asynchronous synchronous getjson

我有一种情况需要进行几次getJSON调用,并且一旦返回所有数据就调用另一个函数,就像这样(例如简化代码):

var data = {};
for (var i in a) {
    $.getJSON(base_url+i, function(d) {
        data[i] = d;
    });
}
do_something(data);
Run Code Online (Sandbox Code Playgroud)

显然这不起作用,因为我在getJSON调用返回任何数据之前调用do_something.

我目前解决此问题的方法是同步进行调用,如下所示:

var data = {};
$.ajaxSetup({'async':false});
for (var i in funcs) {
    $.getJSON(base_url+i, function(d) {
        data[i] = d;
    });
}
$.ajaxSetup({'async':true});
do_something(data);
Run Code Online (Sandbox Code Playgroud)

我的问题是,有更好的方法可以做到这一点,还是我最好同步进行如上所述的呼叫?

Mit*_*ell 5

根据Felix Kling发布的类似问题的链接,答案是使用延迟对象.

然而,由于igetJSON成功功能中的使用,存在进一步的复杂化.这将始终是最后一次迭代的值.有关更多详细信息,请参阅我的其他问题: jQuery Deferred - 延迟getJSON成功函数中的变量范围

完整解决方案

var data = {};
var calls = [];
for (var i in funcs) {
    calls.push(
        $.getJSON(base_url+i,
            (function(i) {
                return function(d) {
                    data[i] = d;
                };
            }(i)) 
        )
    );
}
$.when.apply($,calls).then(function() {
    do_something(data);
});
Run Code Online (Sandbox Code Playgroud)