js发布订阅功能实现

复制代码
/**
 * 发布订阅功能
 * @param {function} subscribe 订阅功能
 * @param {function} publish 发布通知
 * @param {function} remove 移除订阅功能
 */
export const observer = {
  eventList : [],
  subscribe : function(key,fn){
    if(isEmpty(key) || !fn) {
      return
    }else {
      let item = {
        key,
        fn
      }
      this.eventList.push(item)
    }
  },
  publish : function() {
    const [key, ...others] = [...arguments]
    let event = this.eventList.filter(e => e.key === key)
    if(isEmpty(event)) {
      return
    }else {
      event.forEach(e => {
        e.fn.apply(this, others)
      })
    }
  },
  remove: function(key, fn) {
    if(!key) return 
    for(let i=0;i<this.eventList.length;i++) {
      // 如果没有传递fn,则删除所有符合key的事件
      if(!fn) {
        if(this.eventList[i].key === key) {
          this.eventList.splice(i,1)
        }
      } else {
        // 如果传递fn,则删除key与fn一致的监听对象
        if(this.eventList[i].key === key && this.eventList[i].fn === fn) {
          this.eventList.splice(i,1)
        }
      }
    }
  }
}
复制代码

具体使用比如说某个管理界面的数据修改/新增/删除后,在界面某个部分需要同步更新。我的功能放在了utils文件下,自己注意下。

// 订阅对应事件
this
.utils.observer.subscribe('key', () => { // 对应操作,比如重新请求接口 })
// 例:管理界面操作接口成功过后调用,发布事件,保证标识的key一致
this.utils.observer.publish('key')

 

posted @   纯海之蓝  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示