1

アプリを呼び出してデータ (ルート) を取得し、そのデータをループして、個々のルートに関する追加データを取得しています。最終的なデータは問題なく console.log に表示されますが、配列に入れることはできません。

$.getJSON('http://example-app/api/routes/?callback=?', function(data) {
            var routes = [];

            $(data).each(function(i){
                routes.push(data[i]._id);
            });

            function getRouteData(route, callback) {
                $.ajax({
                    url: 'http://example-app/api/routes/'+route+'?callback=?',
                    dataType: 'json',
                    success: function(data) {
                        callback(data);
                    }
                });
            }

            var route_data = [];

            $(routes).each(function(i) {
                getRouteData(routes[i], function(data) {
                    console.log(data); // this shows me the 13 objects
                    route_data.push(data);
                });
            });

            console.log(route_data); // this is empty

        });
4

1 に答える 1

0

nnnnnn さんの権利です。Deferreds/promises を使用route_dataして、コンソールに送信する前に確実に入力する必要があります。

これを行う方法$.when()は、配列ではなく一連の個別の引数を受け入れるという事実に関して、すぐには明らかではありません。

もう 1 つの問題は、個々の ajax の失敗によって企業全体が台無しになってはならないということです。これを克服する方法は、あまり明白ではないかもしれません。

私は100%確実ではありませんが、次の行に沿った何かがうまくいくはずです:

$.getJSON('http://example-app/api/routes/?callback=?', function(data) {
    var route_promises = [];
    var route_data = [];
    function getRouteData(route) {
        var dfrd = $.Deferred();
        $.ajax({
            url: 'http://example-app/api/routes/'+route+'?callback=?',
            dataType: 'json'
        }).done(function(data) {
            //console.log(data); // this shows me the 13 objects
            route_data.push(data);
        }).fail(function() {
            route_data.push("ajax error");
        }).then(function() {
            dfrd.resolve();
        });
        return dfrd.promise();//By returning a promise derived from a Deferred that is fully under our control (as opposed to the $.ajax method's jqXHR object), we can guarantee resolution even if the ajax fails. Thus any number of ajax failures will not cause the whole route_promises collection to fail.
    }
    $(data).each(function(i, route) {
        route_promises.push( getRouteData(route) );
    });
    //$.when doesn't accept an array, but we should be able to use $.when.apply($, ...), where  the first parameter, `$`, is arbitrary.
    $.when.apply($, route_promises).done(function() {
        console.log(route_data);
    });
});

テストされていない

コード内のコメントを参照してください。

于 2012-11-20T06:56:01.230 に答える