2011-12-13 85 views
2

Deferred對象具有兩個主回調池,即doneCallbacksfailCallbacks。兩個池都是「線性的」:回調按照它們的順序依次存儲。使用「延遲」處理的錯誤

這種線性結構似乎違背了處理錯誤時必須考慮的「樹狀」結構。每一步都有兩種情況:失敗和通過。

if(err) { 
    // stuff 
    if(err) { 
      // stuff 
    } else { 
      // stuff 
    } 
else { 
    // stuff 
    if(err) { 
      // stuff 
    } else { 
      // stuff 
    } 
} 

看來,由於Deferred S上施加線性的,他們不是很適合錯誤處理。我可以忽略一些東西嗎

+0

你想達到什麼目的? – 2011-12-13 21:12:44

回答

5

這是一個有點羅嗦,但是這是從jQuery文檔$.when()

在多個延遲對象傳遞給jQuery.when的情況下, 該方法返回的承諾,從一個新的「主人」延遲對象 跟蹤所有延遲的聚合狀態,它已通過 。 只要 延遲結果被拒絕,該方法將解決其主數據庫延遲一旦所有 解決,或拒絕主數據庫延遲。如果解決了主延遲問題,那麼將 傳遞給傳遞給 jQuery.when的所有延遲解析值。例如,當Deferreds是jQuery.ajax() 請求時,參數將爲請求的jqXHR對象,它們在參數列表中給出的順序爲 。

在多Deferreds情況下Deferreds之一被拒絕, jQuery.when立即觸發對於其主站的failCallbacks 推遲。請注意,有些延遲可能仍然沒有解決,這一點在 。如果您需要爲此 大小寫執行其他處理,例如取消所有未完成的ajax請求,則可以在封閉中保留 引用基礎jqXHR對象,並且可以在failCallback中檢查/取消它們。

來源:http://api.jquery.com/jquery.when/

所以,如果一個deferred對象解析錯誤,那麼master deferred火災failCallbacks,它是由你來決定如何處理可能未解決deferred就做。