0

内部にいくつかの URL を含む配列があり、それらの HTML を取得して別の配列 (または JSON など) にプッシュしたいと考えています。

コードは次のようになります。

url = ["/page_1.html", "/page_2.html"];
received_data = [];    

function() {
    url.each(function(i) {
        $.ajax({
            type: 'GET',
            url: this,
            success: function(data) {
                received_data.push(data);
            }
        });
    });

    // send received_data to some other server
};

問題は、このコードが ajax() リクエストを待たずに、received_data を空の状態で送信し始めることです。すべての ajax() リクエストが終了するまで待機する方法 (同期リクエストを使用する場合を除く) ?

4

1 に答える 1

10

の戻り値を$.ajaxとして使用し、次Promiseを使用してそれらすべてが満たされるのを待つことができjQuery.whenます。

function() {
    var gets = [];
    url.each(function(i) {
        gets.push($.ajax({
            type: 'GET',
            url: this,
            success: function(data) {
                received_data.push(data);
            }
        }));
    });

    $.when.apply($, gets).then(function() {
        // send received_data to some other server
    });
};

の呼び出しは、待機する一連の s を配列ではなく個別の引数として$.when受け取ることを想定しているため、少しファンキーに見えます。これを頻繁に行う場合は、jQuery を少し拡張することをお勧めします。PromiseFunction#apply

(function($) {
    $.whenAll = function() {
        return $.when.apply($, arguments);
    };
})(jQuery);

次に、使用法は次のようになります。

$.whenAll(gets).then(function() {
    // send received_data to some other server
});

補足:function実際のコードでは、上記の単語の前に何かがあると思います (たとえば、f = function、またはf: functionオブジェクト リテラルの場合)。それ以外の場合は、名前がないため無効な関数宣言です。(何かがある場合、それは有効な無名関数式です。)

于 2013-05-13T14:38:19.980 に答える