JS異步那些事 二 (分布式事件)

JS異步那些事 一 (基礎(chǔ)知識)
JS異步那些事 二 (分布式事件)
JS異步那些事 三 (Promise)
JS異步那些事 四(HTML 5 Web Workers)
JS異步那些事 五 (異步腳本加載)

分布式事件

PubSub模式

從原生的js角度塘慕,我們要監(jiān)聽某事件的方法就是利用addEventListener方法,但是當(dāng)我們的頁面趨于復(fù)雜,比如要向某個元素添加多個處理事件,那么就要用一個封裝函數(shù)匯集多個處理函數(shù)


link.onclick = function() {
    clickHandler1.apply(this, arguments);
    clickHandler2.apply(this, arguments);
};

在jquery中,jquery.on()方法使用的比較多走净,在新版的jquery中,也舍棄了bind()方法,統(tǒng)一使用on绽媒,jQuery 將link 元素的事件發(fā)布給了任何想訂閱此事件的人。
Node.js中的EventEmitter 對象

要想給EventEmitter 對象添加一個事件處理器免猾,只要以事件類型和事件處理器為參數(shù)調(diào)用on 方法即可是辕。

emitter.on('evacuate', function(message) {
    console.log(message);
});

emit(意為“觸發(fā)”)方法負(fù)責(zé)調(diào)用給定事件類型的所有處理器。舉個例子猎提,下面這行代碼:
emitter.emit('evacuate');
將調(diào)用evacuate 事件的所有處理器获三。

請注意,這里的術(shù)語事件跟事件隊列沒有任何關(guān)系。

使用emit 方法觸發(fā)事件時疙教,可以添加任意多的附加參數(shù)棺聊。所有參數(shù)均傳遞至所有處理器。
emitter.emit('evacuate', 'Woman and children first!');
事件名稱不存在任何限制贞谓,然而Node 相關(guān)文檔還是規(guī)定了一條有用的約定限佩。

實(shí)現(xiàn)一個PubSub模式

一個PubSub模型主要方法有3個,訂閱裸弦,退訂祟同,發(fā)布



<script type="text/javascript"> 
var PubSub = {};
// 用于儲存事件隊列
var queue = {};

// 訂閱接口
PubSub.on = function(event, cb) {
  if (!queue[event]) {
    queue[event] = [];
  }
  queue[event].push(cb);
};

// 退訂接口
PubSub.off = function(event, cb) {
  var currentEvent = queue[event];
  var len = 0;
  if (currentEvent) {
    len = currentEvent.length;
    for (var i = len - 1; i >= 0; i--) {
      if (currentEvent[i] === cb) {
        currentEvent.splice(i, 1);
      }
    }
  }
};

// 發(fā)布接口
PubSub.emit = function(event) {
  var currentEvent = queue[event];
  if (currentEvent) {
    for (var i = 0; i < currentEvent.length; i++) {
      currentEvent[i]();
    }
  }
};
</script> 


####使用
<script type="text/javascript"> 
// 訂閱
var callbackA = function () {
    console.log('event a happened')
};
PubSub.on('a', callbackA);
PubSub.on('b', function() {
    console.log('event b happened')
});

// 退訂 , 第二個參賽傳入回調(diào)函數(shù)的引用
PubSub.off('a', callbackA);

// 發(fā)布
PubSub.emit('a');
PubSub.emit('b');
</script> 

挖個坑 ,找一下jquery.on()的源碼烁兰,看一下它自定義事件的實(shí)現(xiàn)

PubSub模式不適用在一次性的事件中耐亏,,如果是用Promise的話就比較適合一次性的事件沪斟。

關(guān)于分布式事件广辰,也可以參考一下angular.js的雙向數(shù)據(jù)綁定的實(shí)現(xiàn),
angular.js的雙向數(shù)據(jù)綁定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主之,一起剝皮案震驚了整個濱河市择吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌槽奕,老刑警劉巖几睛,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粤攒,居然都是意外死亡所森,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門夯接,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕济,“玉大人,你說我怎么就攤上這事盔几∏缙” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵逊拍,是天一觀的道長上鞠。 經(jīng)常有香客問我,道長芯丧,這世上最難降的妖魔是什么芍阎? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮缨恒,結(jié)果婚禮上谴咸,老公的妹妹穿的比我還像新娘度硝。我一直安慰自己,他們只是感情好寿冕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椒袍,像睡著了一般驼唱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驹暑,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天玫恳,我揣著相機(jī)與錄音,去河邊找鬼优俘。 笑死京办,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帆焕。 我是一名探鬼主播惭婿,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叶雹!你這毒婦竟也來了财饥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤钥星,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后满着,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谦炒,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年风喇,在試婚紗的時候發(fā)現(xiàn)自己被綠了宁改。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡响驴,死狀恐怖透且,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豁鲤,我是刑警寧澤秽誊,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站琳骡,受9級特大地震影響锅论,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楣号,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一最易、第九天 我趴在偏房一處隱蔽的房頂上張望怒坯。 院中可真熱鬧,春花似錦藻懒、人聲如沸剔猿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽归敬。三九已至,卻和暖如春鄙早,著一層夾襖步出監(jiān)牢的瞬間汪茧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工限番, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舱污,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓弥虐,卻偏偏與公主長得像扩灯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躯舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容