4

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

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

显然这不起作用,因为我在 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);

我的问题是,有没有更好的方法来做到这一点,或者我最好像上面那样同步调用?

4

2 回答 2

6

根据 Felix Kling 发布的类似问题的链接,答案是使用deferred objects

i然而,由于在getJSON成功函数中的使用,还有一个更复杂的问题。这将始终是最后一次迭代的值。有关更多详细信息,请参阅我的另一个问题: jQuery Deferred - Variable scope in deferred getJSON success functions

完整解决方案:

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);
});
于 2012-08-10T10:25:26.017 回答
0

我最近开发的一个应用程序也遇到了同样的问题。

在这种情况下,处理数据并确保您的函数在您真正拥有它时正在执行的最佳选择是将函数放在 $.getJSON 调用中。

在您的情况下,它看起来像这样:

var data = {};
for (var i in funcs) {
    $.getJSON(base_url+funcs[i], function(d) {
        data[f] = d;
        do_something(data);
    });
}

像这样,您将确保在处理数据时调用将完成,并且不会出现错误。

于 2012-08-10T10:08:13.530 回答