本文主要是实现发布订阅模式,其实发布订阅模式比较简单,这里只是说下大致的方法含义
1. 直接上代码
function EventEmitter() {
this.pool = {}
}
EventEmitter.prototype.on = function (name, fn) {
if (!this.pool) this.pool = {}
const stack = this.pool[name] || (this.pool[name] = [])
if (stack.includes(fn)) return false
stack.push(fn)
return true
}
EventEmitter.prototype.emit = function (name) {
const stack = this.pool[name]
if (!stack || !Array.isArray(stack)) return false
const args = [].slice.call(arguments, 1)
stack.forEach((fn) => fn(...args))
return true
}
EventEmitter.prototype.off = function (name, fn) {
const stack = this.pool[name]
if (!stack) return false
if (fn) {
this.pool[name] = stack.filter((item) => item !== fn && item.l !== fn)
return true
}
this.pool[name] = []
return true
}
EventEmitter.prototype.once = function (name, fn) {
const handle = (...args) => {
fn(...args)
this.off(name, fn)
}
handle.l = fn
this.on(name, handle)
}
2. 方法介绍
- on — 进行方法的订阅
- emit — 进行方法的提交发射,主要是函数的执行
- off — 取消订阅
- once — 进行方法的一次绑定,执行后自动解绑