EventEmitter可能導致重複註冊和重複觸發

怎麼導致重複?

EventEmitter在同一個函數註冊到同一個event name時會導致重複觸發

例如下面的代碼 

var events = require('events'); 

let ev1 = "ev-1";
let onEv1 = (a, b)=>{
    console.log("event coming: ev-1", a, b);
}

var emitter = new events.EventEmitter(); 
console.log("event on: ev-1, onEv1");
emitter.on(ev1, onEv1);
console.log("event on: ev-1, onEv1");
emitter.on(ev1, onEv1);
console.log("event send: ev-1 123, abc");
emitter.emit(ev1, 123, "abc");

輸出結果如下:  

event on: ev-1, onEv1
event on: ev-1, onEv1
event send: ev-1 123, abc
event coming: ev-1 123 abc
event coming: ev-1 123 abc

要麼自己避免重複的註冊, 要麼可以考慮使用zevent

使用zevent避免重複 

zevent的實現和簡單, 因此也很穩定, 性能高.

代碼位置: [email protected]:gzx-miller/zevent.git

首先, 

npm install zevent

然後如下調用

let { ZEvent } = require('zevent');

let ev1 = "ev-1";
let onEv1 = (a, b)=>{
    console.log("event coming: ev-1", a, b);
}

let event = new ZEvent();

console.log("event on: ev-1, onEv1");
event.on(ev1, onEv1);

console.log("event on: ev-1, onEv1");
event.on(ev1, onEv1);

console.log("event send: ev-1 123, abc");
event.send(ev1, 123, "abc");

setTimeout(() => {
    console.log("event off: ev-1, onEv1");
    event.off(ev1, onEv1);

    console.log("event send: ev-1 456, def");
    event.send(ev1, 456, "def");
}, 200);

結果如下:

event on: ev-1, onEv1
event on: ev-1, onEv1
event send: ev-1 123, abc
event coming: ev-1 123 abc
event off: ev-1, onEv1
event send: ev-1 456, def

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章