0

すべてのコールバック関数が終了するのを待ってから、次のように最終結果を返したいです。

                    var jsonArray = new Array();

                    for(var i = 0; i < 10; i++)
                    {
                        jQueryFunction(i, function(json){
                            jsonArray[i] = json;
                        });
                    }

                    return jsonArray;

jQueryFunction は非同期 ajax とコールバックを含む関数で、json と呼ばれる値を返します。for ループが終了するのを待ってから、すべての戻り値を jsonArray に入れ、最後に返します。

私の目標は、すべての jQueryFunction コールバックが終了するのを待って、戻り値を jsonArray に格納し、最後に jsonArray を返すことです。jsonArray をすぐに返し、for ループを待たないため、以前の目標は機能しません。

私はこのように試しました:

                function jQueryFunction(ptd_url, callback)
                { 
                    $.ajax
                            ({
                                type: "GET",
                                async: true,
                                url: ptd_url,
                                dataType: "jsonp",
                                jsonp: "callback",
                                jsonpCallback: "tpsHandler",
                                success: function(json)
                                {
                                    return callback(json);
                                }
                            });  
                }

                function finalResultFunction()
                {
                    var jsonArray = new Array();

                    for(var i = 0; i < 10; i++)
                    {
                        jQueryFunction(1, function(json){
                            jsonArray[i] = json;
                            alert(jsonArray[i]);
                        });
                    }

                    $.when.apply($, jsonArray).done(function(){
                      alert(jsonArray[0]);
                    ...
                 }

                 setInterval(finalResultFunction,1000);

最初のアラートでは正しいオブジェクトが表示されますが、2 番目のアラートではまだ null が表示されます。なんで?修正方法は?

4

1 に答える 1

2

jquery を使用whenして、複数のリクエストを待機できます。jQueryFunctionを返すにはが必要なだけですjqXHR

function jQueryFunction(){
    return $.ajax( /* ... */ );
}

var requests = [];

for(var i = 0; i < 10; i++)
{
    var xhr = jQueryFunction( /* ... */ );

    requests.push(xhr);
}

$.when.apply($, requests).done(function(){

    // EVERYTHING IS NOW DONE, DO SOMETHING HERE

});
于 2013-10-04T17:43:22.953 に答える