js觀察者模式發布 訂閱

2022-02-25 10:35:03 字數 1488 閱讀 3543

實習期結束,最近回到學校開始學習node.js,node果然是強大。不過在涉及到檔案操作的時候,發現要大量使用非同步回掉操作。

以前在寫頁面的時候,從沒這麼多非同步操作,只有在使用'setinterval'和'xmlhttprequest'時了解了一下非同步程式設計。這次在學習node的過程中,把非同步回掉算是弄清楚了。但是在編碼書寫**的時候,陷入了**金字塔(callback hell)。使用es6promise解決了一些問題。也看到了eventproxy模組基於事件驅動的解決方案。

在使用eventproxy的過程中,有種似曾相識的感覺。有點像觀察者模式發布/訂閱。首先使用陣列快取訂閱者訂閱的訊息,當訂閱者訂閱訊息的時候,把訂閱的訊息push到指定訊息的佇列中,當發布者發布訊息的時候,我們遍歷執行push到指定訊息佇列中的**事件。

而訂閱者不需要關心發布者什麼時候發布訊息。

而發布者不需要關心訂閱者訂閱的狀態。

var observer = new observe();

var callback = function(num) ;

// 訂閱訊息

observer.listen("event1", callback);

observer.listen("event2", callback);

// 移除訂閱訊息1

observer.remove('event1', callback);

// 發布者發布訊息

observer.trigger("event1",1);

observer.trigger("event2",2);

具體**如下:

function observe() 

/** *

* 訂閱者訂閱訊息

* @param key 訊息名

* @param fn **事件

* @return

*/observe.prototype.listen = function(key, fn)

// 訂閱訊息,新增到快取列表中

this._list[key].push(fn);

};/**

* * 移除訂閱的訊息

* @param key 訊息名

* @param fn 回掉事件

* @return

*/observe.prototype.remove = function(key, fn) else }}

};/**

* 發布者發布訊息

* @param key 訊息名

* @param 訊息資料

* @return

*/observe.prototype.trigger = function()

// 遍歷執行當前key下面的所有訊息

for (var i = 0; i < arrfn.length; i++)

};

js 發布 訂閱模式(觀察者模式)

物件間的一種一對多的關係,當乙個物件發生改變時,所有依賴它的物件都會得到通知。比如wb上的明星和其粉絲的關係,粉絲在wb上訂閱了明星,所以當明星在wb上發表動態時所有粉絲都將得到通知。js具體實現 事件 有三個角色 訂閱者 subscriber 訊息分發器 msgdistributor wb例子 d...

js 觀察者和訂閱發布模式

之前一直都認為觀察者模式和發布訂閱模式是一回事,包括網上的很多文章也是這麼寫的,但有一次面試中被問到兩者的區別,直接懵了答不出來,經過最近的一些學習,慢慢理解了兩者的不同。在我看來,兩者最主要的區別在於是否有中間的排程中心。觀察者模式把訂閱者維護在發布者這裡,需要發布訊息時直接發訊息給訂閱者。在觀察...

觀察者模式和發布訂閱模式(JS)

最近被人問到設計模式,觀察者 observer 模式和發布 publish 訂閱 subscribe 模式二者有什麼區別。其實這兩種模式還是有些許差異的,本質上的區別是排程的方式不同。觀察者模式,目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新介面。具體觀察者和具體目標繼承各自的基...