web-dev-qa-db-ja.com

jQuery。可変数の引数を使用してトラブルシューティングする場合

JQuery.when()を使用して、別の関数を呼び出す前に複数のajaxリクエストが終了するのを待つことに問題があります。

各ajaxリクエストはJSONデータを取得し、次のようになります。

   function loadData(arg){
        var ajaxCall = $.ajax(
            URL // depends on arg
        )
       .error( .... );
       return ajaxCall;
   }

リクエストが呼び出されると、戻り値(ajaxCall)がajaxRequestsというリストに追加されます。

    ajaxRequests = [];
    ajaxREquests.Push(loadData(arg))

すべてのリクエストが完了したら、すべてのリクエストが完了するのを待つために、ajaxRequestsを$ .whenに渡そうとしています。

        var defer = $.when.apply($, ajaxRequests);
        defer.done(function(args){
            for (var i=0; i<args.length; i++){
                inst.loadData($.parseJSON(args[i].responseText));
            }
            inst.draw();
        });

instは、JSONデータに基づいてグラフをロードおよび描画するオブジェクトです。

問題は、リクエストが終了するのを実際に待っているようには見えないことです。args[i]はオブジェクトですが、コードの実行時にresponseTextが定義されていません。 args [i]を保存し、後でコンソールからアクセスすると、機能します。

私がウェブ上で見たすべての例がそれに事前定義された引数リストを与えているので、問題は任意の数の引数で.whenを使用することに関連していると思います。

Applyを使用することが正しい考えであったかどうかはわかりませんが、どちらの方法でも正しく機能せず、動作が不規則になります(ブラウザーによって異なります)。

どんな助けでも大歓迎です。

さらに情報が必要な場合はお知らせください。
jQuery1.5を使用しています

31
Alex

アレックスは確かに彼の問題の解決策を提供しましたが、私はそれに従うのが少し難しいことに気づきました。私が解決した彼と同様の問題があり、可変数のajaxリクエストを処理する必要がある他の人と私のソリューションを共有したいと思いました。

// Array of requests
var requests = Array();
requests.Push($.get('responsePage.php?data=foo'));
requests.Push($.get('responsePage.php?data=bar'));

var defer = $.when.apply($, requests);
defer.done(function(){

    // This is executed only after every ajax request has been completed

    $.each(arguments, function(index, responseData){
        // "responseData" will contain an array of response information for each specific request
    });

});
36
Andy Corman

Andy Cormanの回答(私はまだ投稿に返信できないと思います...)に加えて、リクエストが1つしかない場合、応答情報はdefer.doneに直接渡されます-引数として機能します。したがって、その場合はifを指定する必要があります。

// Array of requests
var requests = Array();
requests.Push($.get('responsePage.php?data=foo'));

var defer = $.when.apply($, requests);
defer.done(function(){

    // This is executed only after every ajax request has been completed
    if (requests.length == 1)
        // "arguments" will be the array of response information for the request
    else
        $.each(arguments, function(index, responseData){
            // "responseData" will contain an array of response information for each specific request
        });
});
9
DHainzl

私は今それを解決したと思います-問題は返された引数の処理にありました。 .doneには、応答テキスト、ステータス、jqXHRオブジェクトの3つの引数のみが渡されていました。各クエリの結果としてjqXHRオブジェクトが渡されることを期待していました。

各クエリのコールバックコードを個別の関数に移動することで問題を解決しました(つまり、loadDataのajax呼び出しは、「。loadData(...)」呼び出しを実行するコールバック関数を指定しています)。 .done呼び出しによるのはinst.draw()です。これは正常に機能しているようです。個々のコールバックはそれぞれ.done()の前に実行されます。

それが正確に機能するかどうかはわかりませんが、それは仕事をしているようです。

4
Alex

オープンなajaxリクエストのリスナーを持つajaxStartとajaxStopを試してください。

http://api.jquery.com/ajaxStart/http://api.jquery.com/ajaxStop/

1
user1289347