2011-09-28 18 views
4

promises pattern相似我正在尋找一種避免需要使用addEventListener/etc方法污染對象的事件模式,我希望能夠返回一個對象,可以被取消以及「解決」多次。與支持多個結果和取消的promises/deferred類似的模式

例如,我可以寫一個返回一個「間隔」對象的方法,是這樣的:

var ticker = createTicker(1000); 
var subscription = ticker.then(function() { console.log('tick') }); 
... later on ... 
subscription.cancel(); 

這裏的關鍵差別是,類似於一個承諾的事件是標準化的,讓我可以訂閱時不需要知道事件名稱,但是與承諾不同,「完成」可能會發生多次,甚至可能會被取消(這與removeEventListener相同)。

我很感興趣,看看這是否是合法使用的承諾,使得進步的處理器也可以被用於多個回調,並且從未使用過完整的處理程序,但更重要的是,不存在從一個承諾退訂的概念。

如果情況並非如此,承諾是專門針對這種情況的,那麼是否有一種標準化的模式來做我所描述的?

+0

如何查看EventEmitter模式? – HaxElit

+0

個人而言,我反對像EventEmitter這樣的傳統模式,因爲它有一個原型依賴關係(即所有可執行對象實現事件發射器成員,或者如果您有一個靜態EventEmitter,那麼每個庫必須同意只有一個EventEmitter) ,承諾模式是好的,因爲它封裝了「事件」,並且不需要圖書館就標準承諾對象達成一致,因爲承諾模式都是多態的 – meandmycode

回答

2

取消能力可以添加到承諾實現中,而不會破壞單火成功/失敗回調的主要範例。

事實上,jQuery的已經取消了它從jQuery.ajax調用返回的承諾情況:

對於使用XMLHttpRequest的向後兼容性,一個jqXHR對象將 暴露出以下屬性和方法:

  • readyState的
  • 狀態
  • 狀態文本
  • 當基礎請求分別用xml和/或文本響應時,響應XML和/或responseText
  • setRequestHeader(name,value)通過用新值替換舊值而不是將新值連接到標準舊
  • getAllResponseHeaders()
  • getResponseHeader()
  • 中止()

你可以寫一個setTimeout包裝,公開承諾接口以及一個額外的取消方法。

但是,一旦你進入多火領域,我認爲這不是承諾的目的。您將不得不定義多個規則和例外,以及多次發射將如何與常規諾言功能一起發揮作用。以這種方式使用承諾對我來說沒有多大意義。


更新(基於評論討論):

這裏有一個承諾,「代理」,允許中止完成/失敗回調的進一步中繼的樣本實現:

http://jsfiddle.net/atesgoral/qvtqu/

+0

謝謝,我同意我不能有多個完整的調用發生,任何如果控制代碼試圖做到這一點,那麼正確執行承諾應該是錯誤的,所以如果假承諾試圖做到這一點,那麼如果鏈接在一起,將會對其他承諾產生直接問題。關於取消,我應該更清楚這一點,這是取消訂閱與取消操作..例如,ajax電話我想取消我的回調被解僱,而不是實際的操作。 – meandmycode

+0

我想我比任何我試圖找到一個現有的模式,正如我所描述的,或者是否有任何有關從諾言退訂回調的討論。 – meandmycode

+0

您可以編寫一箇中繼目標承諾回調的代理。這個代理本身會暴露一個承諾接口並且可以被取消。取消後,它將停止傳遞迴調。您可能也可以使用deferred.pipe()來代替編寫自己的代理服務器:http://api.jquery.com/deferred.pipe/ –

相關問題