手写系列之发布订阅模式 - 图1


本文主要是实现发布订阅模式,其实发布订阅模式比较简单,这里只是说下大致的方法含义

1. 直接上代码

  1. function EventEmitter() {
  2. this.pool = {}
  3. }
  4. EventEmitter.prototype.on = function (name, fn) {
  5. if (!this.pool) this.pool = {}
  6. const stack = this.pool[name] || (this.pool[name] = [])
  7. if (stack.includes(fn)) return false
  8. stack.push(fn)
  9. return true
  10. }
  11. EventEmitter.prototype.emit = function (name) {
  12. const stack = this.pool[name]
  13. if (!stack || !Array.isArray(stack)) return false
  14. const args = [].slice.call(arguments, 1)
  15. stack.forEach((fn) => fn(...args))
  16. return true
  17. }
  18. EventEmitter.prototype.off = function (name, fn) {
  19. const stack = this.pool[name]
  20. if (!stack) return false
  21. if (fn) {
  22. this.pool[name] = stack.filter((item) => item !== fn && item.l !== fn)
  23. return true
  24. }
  25. this.pool[name] = []
  26. return true
  27. }
  28. EventEmitter.prototype.once = function (name, fn) {
  29. const handle = (...args) => {
  30. fn(...args)
  31. this.off(name, fn)
  32. }
  33. handle.l = fn
  34. this.on(name, handle)
  35. }

2. 方法介绍

  • on — 进行方法的订阅
  • emit — 进行方法的提交发射,主要是函数的执行
  • off — 取消订阅
  • once — 进行方法的一次绑定,执行后自动解绑