简版事件发布订阅

  class EventEmit {
    constructor() {
      // 存储事件名和回调
      this.listen = new Map()
    }
    // 注册事件,添加回调
    on(name, callback) {
      const listen = this.listen
      if (listen.has(name)) {
        // 已存在事件,直接尾部添加回调
        const callbacks = listen.get(name)
        listen.set(name, [...callbacks, callback])
      } else {
        // 不存在事件,新加回调数组,方便同一事件多次添加回调
        listen.set(name, [callback])
      }
    }
    // 触发事件,传递参数,参数个数未知,采用rest
    emit(name, ...rest) {
      const callbacks = this.listen.get(name)
      // 有回调数组才执行
      if (callbacks && callbacks.length) {
        // 循环执行回调,并把所有参数传递给每个回调
        callbacks.forEach(fn => {
          fn(...rest)
        });
      }
    }
    // 移除指定事件的回调
    remove(name, callback) {
      const callbacks = this.listen.get(name)
      if (callbacks && callbacks.length) {
        // 使用数组筛选剔除要删除的回调
        const newCallbacks = callbacks.filter(fn => {
          return fn !== callback
        });
        this.listen.set(name, newCallbacks)
      }
    }
    // 移除指定事件的全部回调
    removeAll(name) {
      this.listen.set(name, [])
    }
    // 注册事件,添加只执行一次的回调
    once(name, callback) {
      // 重新包装回调,执行之后,执行移除
      const newCallback = (...rest) => {
        callback(...rest)
        this.remove(name, newCallback)
      }
      this.on(name, newCallback)
    }
  }

	// 测试
  const event = new EventEmit()
  event.on('fn', (...rest) => {
    console.log('rest')
    console.log(...rest)
  })
  event.on('fn', (...rest) => {
    console.log('rest2')
    console.log(...rest)
  })
  event.once('fn', (...rest) => {
    console.log('rest3')
    console.log(...rest)
  })
  event.emit('fn', 1,2,3,4)
  event.emit('fn', 1,2,3,4)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值