• 作者:老汪软件技巧
  • 发表时间:2024-09-17 17:02
  • 浏览量:

class Event {
    constructor() {
      this.event = {},
      this.onceFn = []
    }
  
    on(type, fn) {
      if (!this.event[type]) {
        this.event[type] = []
      }
      this.event[type].push(fn)
    }
  
    emit(type, data) {
      this.event[type].forEach((item) => {
        item(data)
      })
    }
  
    off(type, fn) {
      this.event[type] = this.event[type].filter((item) => item !== fn)
    }
  
    once(type, fn) {
      if (this.onceFn.includes(fn)) {
        return
      }
      this.onceFn.push(fn)
      this.on(type, fn)
    }
  
  }

在上述代码中我们使用类构造函数创建了一个Event函数,在构造函数中我们创建了四个函数on(),emit(),off(),once().且在 constructor()创建了一个对象this.evnet用于存储时间及其对应的处理器列表,数组this.onceFn用于存储只执行一次的函数.那么我们创建的四个函数分别时什么作用呢?

on()是用于订阅事件的.那么这个订阅的思路是如何实现的呢?on()接收两个参数type和fn,其中type表示的是事件类型,fn是事件函数。if (!this.event[type])在对象中如果不存在该属性,this.event[type] = []就添加该属性并把该属性的值设置成一个数组,最后将该事件type的函数存到数组中.这就是on()的作用

面试场景题手写一个发布订阅,你会吗?_面试场景题手写一个发布订阅,你会吗?_

emit()发布订阅,接收两个参数type,data这个data是代表函数中的参数,我们使用forEach循环遍历this.evnet[type]数组并执行函数.

off()这是取消订阅事件,它接收参数的意义和on()其实是一模一样的我们使用filter过滤器去除事件类型为type中的某一个函数fn并重新把它赋值给this.event[type].这样的话我们就是实现了取消订阅.

once()也是接收两个参数.但是它的作用是保证同一事件函数值被调用一次,防止被多次调用.首先我们会检查在数组onceFn中是否存在只需要执行一个的函数,如果存在的话,就直接return返回就就不会走下一步.如果存在,就先将该函数添加到数组onceFn中,然后调用on()订阅该事件.


上一条查看详情 +大数据处理脚本优化
下一条 查看详情 +没有了