怎麼導致重複?
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