2012-09-28 49 views
2

我試圖在其狀態設置爲成功之前向現有Deferred的合同添加另一個異步調用。而不是試圖和在英國解釋這一點,請參閱下面的僞代碼:jQuery 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個通話,我想要執行所有完成代碼。我的理解是,Deferred.pipe()應該將另一個異步調用鏈接給給定的延遲,但實際上,我總是在完成所有之後完成Call 2。

有誰知道如何讓jQuery的延期做我想做的?希望解決方案不涉及將代碼拆分成塊。

感謝您的任何幫助。

更新:請參閱我的follow up question

回答

4

你必須調用.pipe第一$.ajax調用返回,而不是它的成功回調中的遞延對象(不帶任何效果):

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

.pipe返回一個新的延期對象,只有兩者都得到解決,最初的延期對象和返回的對象纔得到解決。

+0

最後一行應該是'.done',而不是'.then' – Alnitak

+0

@Alnitak:這有什麼關係嗎? –

+0

它在1.8+中,其中'.then'現在等同於'.pipe'本身 – Alnitak