🤺JavaScript之 实现EventEmitter订阅监听模式
发布订阅模式我记得好像ES6的Proxy这一章节里面的观察者模式也有…如果想得起来我也写一下
实现EventEmitter发布订阅
首先明确这是一个类,
class EventEmitter {
constructor() {
this.events = {};
}
on(eventName, callback) {
if(!this.events[eventName]) {
this.events[eventName] = [callback];
}
else {
this.events[eventName].push(callback);
}
}
emit(eventName, ...args) {
this.events[eventName].forEach(fn => fn.apply(this.args));
}
once(eventName, callback) {
const fn = () => {
callback();
this.remove(eventName,fn);
}
this.on(eventName, fn);
}
remove(eventName, callback) {
this.events[eventName] = this.events[eventName].filter(fn => fn != callback);
}
}
这个类会有一个构造函数,里面存放了一个对象。然后就是他的各种API
了
- on
该函数是用来为时间注册监听器,但是一个事件可能会有很多个监听器啊,所以每一个事件对应的值是一个数组,然后把回调函数push
进去就好了。 - emit
该函数就是执行完对应的事件的所有监听器。所以循环这个数组然后挨个执行。这里需要注意的是,我们需要用到apply
去改变this
指向,因为可能是不同的对象去调用。 - once
该函数是注册一个一次性的监听器,所以我们创建一个新函数,这个函数执行完回调之后会立马删除,达到了目的 - remove
该函数就是删除回调函数,所以就是使用filter
过滤掉参数中的回调就行。