18

ajax呼び出しを特定の順序で実行する必要がある状況があります。他の状況でjQueryDeferredオブジェクトを使用しましたが、これを適切に動作させる方法が見つからないようです。

ajax一生のうちにたくさんのリクエストを実行する機能があります。一部のリクエストは、他のリクエストの成功コールバック中に実行されます。

私の質問:ネストされたすべての遅延オブジェクトを元の呼び出しに戻す方法はありますか?$.when

簡単な例は次のとおりです。

function nestedAjax() {
    $.get("/", function(){
        console.log("First ajax done.");
        $.get("/", function(){
            console.log("Second ajax done.");
        });
    });
};

私はnestedAjax使用する関数を持っ$.when()ている$.done()ようにしようとしています:

$.when(nestedAjax()).done(function(){
    console.log("Complete");
});​

コンソール出力の読み取り値:

> First ajax done.
> Second ajax done.
> Complete.

私はこれを達成するために最初に戻ることができgetます:

> First ajax done.
> Complete.
> Second ajax done.

しかし、明らかにこれは私が必要とするものではありません。どんな助けでもいただければ幸いです。

4

3 に答える 3

14

実はとても簡単です。すべてのAJAX呼び出しは遅延オブジェクトですが、私はまだメソッド自体に1つ使用しています。

function nestedAjax() {
    var dfd = $.Deferred();
    $.get("/echo/json/", function(){
        console.log("First ajax done.");
        $.get("/echo/json/", function(){
             console.log("Second ajax done.");
            dfd.resolve();
        });
    });

    return dfd.promise();
};
于 2012-09-05T13:50:48.683 に答える
7

実際には、余分な遅延オブジェクトは必要ありません。あなたはと連鎖することによってあなたが望むことをすることができますthen()

function nestedAjax() {
    return $.get("/echo/json/").then(function(result1){
        console.log("First ajax done.");
        if (result1) {
            return result1;
        } else {
            return $.get("/echo/json/").then(function(nestedResult){
                console.log("Second ajax done.");
                return nestedResult;
            });
        }
    });
};

これを同期的に実行しているのはおそらくそれが理由だと思うので、いくつかのロジックを追加しました。その後、次の$.whenように結果を使用できます。

$.when(nestedAjax(), $.get("/something/else")).then(function(nested, other) {
    console.log("Complete.", nested, other);
});
于 2013-03-07T21:53:31.490 に答える
1

上記の回答に何らかの理由でコメントを追加できませんでした。

だから私はここに私のコメントを追加します。上記の答えは、ajax呼び出しが高速で、dfd.promise()を返す前に戻る場合にのみ機能します。

私も同じ問題を抱えてる。そしてあなたが見ることができるように。返された遅延オブジェクトは、「保留中」であることを示しています:http: //jsfiddle.net/BtEKa/

于 2012-09-13T09:23:06.747 に答える