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が同様の質問に投稿したリンクによると、答えは遅延オブジェクトを使用することでした。

ただし、 success関数iでの使用により、さらに複雑になります。getJSONこれは常に最後の反復の値になります。詳細については、他の質問を参照してください 。jQueryDeferred-遅延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);
});
于 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 に答える