0

ajax呼び出しから遅延オブジェクトを返すネストされた関数がたくさんあります。これが私のコードのようです

function makeCalls() {
    var ajaxDfd1 = $.ajax(...);

    ajaxDfd1.then(function() {
        // want to execute after first call
        var ajaxDfd2 =  $.ajax(...);

        ajaxDfd2.done(function() {
            // want to execute after second call
        });

        return ajaxDfd2;
    });

    return ajaxDfd1;
}

makeCalls().done(function() {
    // stuff here was executed early
});

しかし、私の呼び出しは、意図した順序で実行されていません。中身は実際に行わmakeCalls().done()れる前に呼ばれているようです。ajaxDfd2

4

3 に答える 3

0

私は何かがおかしいに違いないことを知っていて、これをじっと見つめていました 。jQuerydeferredの「then」メソッドをいつ使用する必要があり、「pipe」メソッドをいつ使用する必要があるのでしょうか。

後で私は私ができないことに気づきました

var dfdObj = $.ajax(...);
dfdObj.then(...);

return dfdObj;

これは実際には遅延オブジェクトを返しません。Ajaxオブジェクトを返しますが、これは通常のオブジェクトであるため、自動的に解決済みとして分類され、.done()関数は早期に呼び出されていました。代わりに、返品したい場合はこれを行う必要がありますvar

var dfdObj = $.ajax(...).then(...);

return dfdObj;
于 2013-02-21T11:43:05.900 に答える
0

コードは次のように機能します。

function makeCalls() {
    var ajax1 = $.ajax(…);
    var ajax1and2 = ajax1.then(makeCall2);
    function makeCall2() {
        // want to execute after first call
        var ajax2 =  $.ajax(…);
        ajax2.done(after2);
        function after2() {
            // want to execute after second call
        });
        return ajax2;
    });
    return ajax1;
}

var ajax1 = makeCalls();
ajax1.done(function() {
    // stuff here was executed early
});

ajax1and2then必要な/pipe呼び出しの結果です。そのコールバックは、 を待つ の結果makeCall2(つまりajax2) を待ちajax1ます。after2コールバックと同じです。

それでも、makeCalls関数はオブジェクトを返し(グローバル変数にもajax1割り当てていることがわかります) 、最初の ajax が終了した後に、と完了コールバックの両方が実行されます。ajax1makeCall2

ajax1and2したがって、代わりに遅延を返す必要があります。

function makeCalls() {
    return $.ajax(…).then(function() {
        return $.ajax(…).done(function() {
            // want to execute after second call
        });
    });
}

makeCalls().done(function() {
    // stuff here is now executed after second call as well
});
于 2013-02-22T23:23:26.220 に答える