2012-04-22 73 views
4

如何將一個JQuery.Deferred()對象上的所有事件傳播到另一個JQuery.Deferred()對象?在JQuery.Deferred對象之間傳播事件

是否有更好的/簡單/短調用其他對象.rejectWith.resolveWith方式,然後同時處理.fail .then .done? 我假設我不必處理 .done .then,因爲當我調用拒絕或解決時它將被調用。

我懷疑也許這可以使用.pipe來完成,但我不知道如何。

UPDATE:

注:我也我固定的一些文字上述每@弗雷德裏克·哈米迪的評論。

我想實現是以下幾點:

我已經陷入到服務器,讓AJAX調用一個API, 他們將返回Ajax對象(這是一個$ .Deferred本身)。

在某些時候,我需要處理一個我沒有網絡工作的情況(這是針對在移動設備上運行的phonegap應用程序)。

我想要做的是,如果沒有網絡連接,我會顯示一個對話框,提示用戶解決網絡問題並點擊「重試」。

但是在這種情況下,我將不會調用$ .ajax,直到用戶點擊重試爲止,所以我沒有$ .Defferred對象來返回調用API的函數開始。

所以我結束瞭解,我可以創建一個新的$ .Defferred並返回它,並在重試按鈕的回調中調用$ .ajax本身,將其設置爲「relay」/將defferred事件傳播到我剛剛通過將它作爲封閉的一部分進行了返回。

但我不確定如何去做。我用的方法.pipe是查詢股價,因爲其描述說,它的一個:

實用的方法來過濾和/或鏈Deferreds

我很抱歉,這讓我的問題更加清楚。

+0

我不知道我正確理解你的問題。 'then()'用第二個參數覆蓋'fail()',所以你不必同時使用兩者。 'pipe()'確實是將延遲調用的結果傳遞給另一個調用的方式,但即使在這種情況下,您仍然需要調用'resolveWith()','rejectWith()'和可能的'notifyWith() (或者像'$ .ajax()'這樣的其他東西)來解決管道延遲調用。你能舉一個你想達到的例子嗎? – 2012-04-22 11:08:23

+1

我讀了這個問題,突然間,我意識到我對* jQuery.deferred'的整個概念有*不知道。 ......再過一個晚上的睡眠。 =/ – 2012-04-22 13:34:45

回答

1

如果我理解正確,您只需要一個Deferred來解析/拒絕並通知與您的ajax請求完全相同的值?如果是這樣,假設你的遞延對象稱爲延遲,下面的代碼將這樣的伎倆:

$.ajax(...).done(defer.resolve).fail(defer.reject).progress(defer.notify); 

它的工作原理,因爲defer.resolve,defer.reject和defer.notify是詞法約束:上下文(本)和值(參數)正確地傳遞,所以您只是有效地將ajax承諾的狀態轉換爲新的延遲。

+0

只是爲了澄清 - 當你說詞彙綁定你的意思是一個對他們的調用將執行'defer'作爲上下文? (即它們中的'this'將會是'defer',因此我不需要使用額外的代理模式)。你怎麼知道這是事實? – epeleg 2012-04-23 06:25:34

+2

我編寫了代碼,這就是我所知道的;)'this'不會是'defer',它將是由ajax給出的任何上下文。但是,由於解析,拒絕和通知都是在閉包中定義的,所以它們將按照預期正確使用'defer'的內部結構。 – 2012-04-23 07:18:05

+0

:)我很榮幸。這是記錄在任何地方?我做了類似的事情,但是因爲我不知道他們在哪裏使用'.proxy(deferred,'reject')'代理它們(再次)。 也可能應該有一個快捷方式 - 也許'.tee(推遲)'。 – epeleg 2012-04-23 07:48:41