2011-09-14 22 views
0

我正在使用jQuery 1.5.2,並有多個成功回調註冊到Ajax請求。在第一次成功回調中,我需要檢查響應是否具有我需要的所有數據,如果沒有,則取消所有後續成功回調。如何從jQuery ajax成功處理程序中取消所有後續成功回調?

注意:我無權訪問由服務器發送的標頭。它總是發送一個200 Success

第二個注意:我不能只是結合這兩個回調。這是一個簡單的例子,我用一個更大的系統在代碼中的不同位置註冊回調。

如何取消後續成功回調?

一些示例代碼看起來像這樣(jsfiddle):

var request = $.ajax({ 
    url: '/echo/json' 
}); 

// First success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('first', jqXHR); 
    if ($.isEmptyObject(data)) { 
     // I want to cancel the second success handler here! 

    } 
}); 

// Second success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('second', jqXHR); 
}); 

謝謝!

+0

我在看jQuery代碼,我真的不能看到這樣做的一種方式。爲什麼他們分成兩個電話呢? – Andrew

+1

這裏有多個回調有什麼意義?爲什麼不將這些函數集成到第一個回調方法本身中呢? – arviman

+1

這是一個具有多個回調的更復雜系統的簡化示例。 –

回答

0

在你的回調函數,你應該做的是檢查狀態變量的第一件事情(或者 '標記') ,根據當前情況,它會通知函數是否可執行。

不想讓回調執行了嗎?將該標誌設置爲某個值,並且如果該標誌在執行時具有該特定值,則立即返回回調函數。

或者你可以決定只運行XX回調,或者只是暫停它們。

如果您設置了這樣的系統,您可以從一個地方控制具有多個異步回調的較大Web應用程序的行爲,它將爲您提供很多靈活性和選項。

爲了幫助你,你可以有一個函數作爲一個調度器。每當你想改變回調的行爲時,這個函數將被用作回調函數。您將傳遞正常回調函數作爲參數調用,然後調度程序將在決定繼續正常回調之前檢查正確的條件。

這樣你就不需要檢查回調函數中的條件了。對於具有非常多回調的大型應用程序尤其有用。

+1

您獲得了提供更多信息的答案。謝謝! –

0

只是合併。

// Success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('first', jqXHR); 
    if ($.isEmptyObject(data)) { 
     return; 
    } 
    else { 
     console.log('second', jqXHR); 
    } 
}); 

或者試試這個:

var request = $.ajax({ 
    url: '/echo/json' 
}); 
second = true; 
// First success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('first', jqXHR); 
    if ($.isEmptyObject(data)) { 
     second = false; 
    } 
}); 

// Second success handler 
request.done(function(data, textStatus, jqXHR) { 
    if(second) 
     console.log('second', jqXHR); 
}); 

小提琴:http://jsfiddle.net/maniator/zGvPW/3/

+0

與「或嘗試這個」解決方案,但將標誌添加到jqXHR對象。在第一個成功處理程序中,我使用了'jqXHR.failed = true',而在第二個中我使用了'if(!jqXHR.failed)'(http://jsfiddle.net/zGvPW/4/) –

+0

EricFreese ...通常是選擇**給你答案的答案......並且實際上對未來的用戶有幫助。 – Neal