1. 程式人生 > >pubsub.js簡介,一個利用JavaScript進行釋出/訂閱的庫

pubsub.js簡介,一個利用JavaScript進行釋出/訂閱的庫

很長一段時間裡,我一直在致力於為某客戶開發大型Web應用程式。為web前端實現釋出/訂閱式通訊,我們使用在body元素上被觸發的jQuery自定義事件。這是一個相當巧妙的方法,以確保模組鬆耦合,因為你事實上只是跟蹤使用者做什麼,而不是哪個模組生成的訊息。

這種方法已經被我介紹給我的團隊,而且我一直很熱心地幫助我的隊友知道如何使用它。

我對這個方法一直很滿意,我已經在BerlinJS討論組中發起了一個討論。其他一些人也已採取這種方法,有些已在腳註中列出。

最近,我對這種方法越來越不滿意了。

在使用jQuery自定義事件進行釋出/訂閱時你最終會遇到其中一個問題,就是它們是同步的,所以你最終會在你對當前事件結束操作之前觸發新的事件。

它會變得很亂,相信我。

那麼,為什麼需要一個新庫?

嗯,其實有很多原因,最終使我在用JavaScript做釋出/訂閱中訊息時尋找更好的方法。

我想要的東西將滿足下列大部分的要求:
•    有合理軟體許可的出版商(CC,MIT,BSD,Apache,WTFPL等)
•    所有訊息預設通過非同步傳送,別的只會令人困擾
•    不使用DOM(它太慢,並很愚蠢的儲存一些你無法控制的狀態)
•    純JavaScript的,沒有對其它庫的依賴
•    沒有副作用,用jQuery修改訂閱(給函式增加一個“ID”屬性)
•    應當能運行於瀏覽器外
•    應當有最新的文件(或至少與基本程式碼一致)
•    測試是重要的好嗎?

•    短小精悍

那麼,事實證明,我在網際網路上搜索空手而歸(我的Google-fu應該更好),所以我決定親自寫一個實現。我把它叫做PubSubJS。

我已經把它釋出在http://github.com/mroderick/PubSubJS,你可以輕鬆得到它,如果你喜歡就執行測試,甚至通過擴充套件而為它做出貢獻。


那麼,這個PubSubJS可以做什麼呢?

不是很多。

基本上,你可以訂閱的息,釋出訊息(通過一個繫結項)和訊息退訂。如果你喜歡冒險的感覺(或你真的相信已經100%的理解庫的前因後果),你也可以用同步方式強制釋出訊息。

讓我們來看看一些寫好的程式碼!

[javascript] 
view plain
 copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. // subscribing to messages is quite easy,
  2. // first we'll create a subscriber function
  3. var logToConsole = function( message, data ){  
  4. // once a message arrives, it'll get logged to the console
  5. // data passed in messages can be whatever you want
  6. console.log( message, data );  
  7. };  
  8. // every subscription gives you a token,
  9. // you should keep it if you want to unsubscribe
  10. var token = PubSub.subscribe( 'some message', logToConsole );  
  11. // publishing messages is also quite easy
  12. PubSub.publish( 'some message''hello world!' );  
  13. // now let's unsubscribe from this message
  14. //(譯者注,需要註釋掉下面程式碼,保持訂閱,才可在控制檯看到輸出結果)
  15. PubSub.unsubscribe( token );  

所以,就像你可以看到,它用起來十分簡單。

為了說明利用JavaScript和JavaScript + DOM在執行速度方面的不同,我建立了一個JSPerf.com 測試頁面,就是compares PubSubJS performance to jQuery custom events。你可以去試一下。


那麼,我是不是該使用它?

不!… 當然,也許 …

如果你正在構建較大的web應用程式,而且需要在模組/元件/構件等之間具有鬆耦合,那麼釋出/訂閱可能是你要尋找的答案。

如果在你構建較大的web應用程式時碰巧使用Dojo並需要釋出/訂閱,那麼我建議你看一下早在Dojo的實施方案,或聯絡Rebecca Murphey ;-)

想想看:釋出/訂閱有點像炸藥。在考慮周全的專家之手,你可以期望在合理的時間內有安全地拆除一幢摩天大樓。在業餘愛好者手中,使用炸藥,你最終會看到最不想看到的,在一片非常嘈雜而凌亂的情況下告終。而且可以肯定,每過一段時間,就算是專家也會犯錯誤。

“那麼為什麼還要寫一個釋出/訂閱庫?”你可能會問,而得到的答案很簡單:我需要它,就像爆破專家需要獲得高效、穩定和可預測的炸藥。
不要說我沒提醒過你。
•    Sammy.js還使用jQuery自定義事件。然而,我還是試圖說服Aaron使用純JavaScript釋出/訂閱訊息來代替。
•    處理錯誤和用釋出訂閱載入通知

寫PubSubJS後,我發現Peter Higgins已經為jQuery實現了釋出/訂閱。

/*-----------------------------------------------------分割線------------------------------------------------------------*/

首次翻譯,藉助Google翻譯進行輔助,比較拙略,難免有不盡人意的地方,還請大家多多包涵!O(∩_∩)O~

原文地址:roderick.dk/2010/10/12/introducing-pubsubjs-a-library-for-doing-publish-subscribe-in-javascript/