2

状態が成功に設定される前に、既存のDeferredのコントラクトに別の非同期呼び出しを追加しようとしています。これを英語で説明するのではなく、次の擬似コードを参照してください。

$.when(
    $.ajax({        
        url: someUrl,
        data: data,
        async: true,        
        success: function (data, textStatus, jqXhr) {
            console.log('Call 1 done.')
            jqXhr.pipe(
                $.ajax({        
                    url: someUrl,
                    data: data,
                    async: true,        
                    success: function (data, textStatus, jqXhr) {
                        console.log('Call 2 done.');
                    },       
                })
            );
        },       
    }),
    $.ajax({        
        url: someUrl,
        data: data,
        async: true,        
        success: function (data, textStatus, jqXhr) {
            console.log('Call 3 done.');
        },       
    })
).then(function(){ console.log('All done!'); });

基本的に、コール2はコール1の結果に依存します。コール1とコール3を並行して実行したいと思います。3つの呼び出しがすべて完了したら、AllDoneコードを実行します。私の理解では、Deferred.pipe()別の非同期呼び出しを特定の遅延にチェーンすることになっていますが、実際には、すべて完了した後に常に呼び出し2が完了します。

jQueryのDeferredに私がやりたいことをさせる方法を知っている人はいますか?うまくいけば、解決策には、コードをチャンクに分割する必要がありません。

助けてくれてありがとう。

更新:フォローアップの質問をご覧ください。

4

1 に答える 1

4

.pipe成功コールバック内ではなく、最初の呼び出しによって返された遅延オブジェクトを呼び出す必要が$.ajaxあります (これはまったく効果がありません)。

$.when(
    $.ajax({        
        // ...      
    }).pipe(function() {
        // return a deferred object from .pipe
        return $.ajax({        
            // ...      
        });
    }),
    $.ajax({        
        // ...       
    })
).done(function(){ console.log('All done!'); });

.pipe元の遅延オブジェクトと返されたオブジェクトの両方が解決された場合にのみ解決される、新しい遅延オブジェクトを返します。

于 2012-09-28T15:39:01.723 に答える