怎么导致重复?
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的实现和简单, 因此也很稳定, 性能高.
代码位置: git@github.com: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