用訂閱 發布者模式解決非同步函式結果依賴的問題

2022-04-04 15:08:33 字數 1147 閱讀 2977

我們都知道node是基於事件無阻塞i/o模型的,所以說大部分函式都是以非同步實現的,請看下面**:

db.query(sql1, function

(err, data) )

db.query(sql2,

function

(err, data) )

如果我們上述兩個操作,結果之間沒有什麼聯絡,那很好,基於node的i/o無阻塞模型,每個操作都做著自己的事情,美滋滋~

但是在一些情況下這兩個操作的結果有聯絡的,比如說第乙個操作從資料庫中取出乙個人的姓,第二個操作從資料庫中取出同乙個人的名。

假設我們有乙個需求就是我們要把這兩個操作的結果組合起來變成乙個人的姓名(這個操作貌似有點浮誇,嘻嘻),也就是說我們要組合成姓名這個操作必須是在姓和名都取到的情況下才能進行,可達鴨眉頭一皺,發現事情並不簡單。我們知道上述兩個操作是非同步操作,他們何時結束我們根本不能知道,只知道他結束時會執行**函式。下面我們就用訂閱發布者模式來解決它。請看下面**:

var count = 0;

var results ={};

var done = function (key, value)

}db.query(sql1,

function

(err, data) )

db.query(sql2,

function

(err, data) )

這樣一來,每個i/o完成都會執行done方法,把取到的資料存到results物件中,也就是訂閱,而當訂閱數等於2的時候,也就是兩個操作都完成並且都把資料存在results中了,那麼就可以發布,也就是執行組成姓名的操作。利用訂閱/發布者模式實現多對一,基本完成了我們的需求,但是這樣的**是醜陋的,我們用閉包和偏函式把**優化並且抽象一下,以適合更多的需求。改進**如下:

var after = function

(times, callback) ;

return

function

(key, value)

};};//

對閉包的引用

var done = after(times, render);

ps:利用node的events模組我們還可以實現訂閱/發布者的多對多模式。

訂閱 發布者模式 JavaScript

具體模式內容介紹網上能搜得到一堆堆.下面就是貼出下自己倒騰的 內容.function global 儲存狀態資料 發布 this.publish function type param is not define return obj type foreach value 訂閱 this.subsc...

訂閱發布者模式的簡單實現

什麼是訂閱發布者模式?乙個物件作為特定任務或是另一物件的活動的觀察者,並且在這個任務或活動發生時,通知觀察者。觀察者也被叫作訂閱者 subscriber 它指向被觀察的物件,既被觀察者 publisher 或 subject 當事件發生時,被觀察者 publisher 就會通知觀察者 subscri...

自己用C 寫乙個發布者訂閱者模式

突然想整理一下自己用過的這個模式,半小時寫下了這些 首先定義兩個基類,class notifier 發布者 和 class receiver 訂閱者 在發布者類中有成員 std vectorobserverlist,該vector用於儲存訂閱者物件,當發布者需要發布訊息時,訊息會被傳送給vector...