1、新建一个Publishtion.js
class Publishtion {
  
  subscribers = {
    any: []
  }
  // 添加订阅者 订阅者 = 注册方法
  on(type,fn) {
    type = type || 'any'
    if (typeof this.subscribers[type] === 'undefined') {
      this.subscribers[type] = []
    }
    this.subscribers[type].push(fn)
  }
  // 移除订阅者
  remove() {
    // 传入参数 移除的指令 移除的用户 对应的订阅消息
    this.visitSubscribers('unsubscribe', fn, type)
  }
  // 发布消息 
  publish(publication, type) {
    // 传入参数 发布消息的指令 发布的内容 发布到具体哪个类目
    this.visitSubscribers('publish', publication, type)
  }
  // 访问订阅库 参数 传入的动作 arg是用户或者消息 type消息的类型
  visitSubscribers(action, arg, type) {
    // 需要访问的具体的消息类别 若没有 则为默认消息
    var pubtype = type || 'any',
      // 获取订阅此消息的所有用户的列表
      subscribers = this.subscribers[pubtype],
      i,
      // 获取用户数量
      max = subscribers ? subscribers.length : 0
    for (i = 0; i < max; i++) {
      // 如果操作是 发布消息
      if (action == 'publish') {
        // 发布的内容 
        subscribers[i](arg)
      } else {
        // 如果操作不是发布 则进行删除订阅该消息对应的某个用户 就是传入的方法
        if (subscribers[i] === arg) {
          // 删除这个 1个
          subscribers.splice(i, 1)
        }
      }
    }
  }
}
export {
  Publishtion
}2、在app.js中实例化一个对象var { Publishtion} = require('./utils/Publishtion');
App({
  onLaunch() {
        // 将这个类挂载到全局唯一实例的App上
     
        this.topic = new Publishtion();
        //模拟接收到消息
        setInterval(() => {
          //新用户登录发布消息
          this.topic.publish("hello","newuser")
        
        }, 3000);
   }
})2、调用const app = getApp()
//订阅消息
app.topic.on('newuser',data => {
console.log(data);
});
//退订消息
app.topic.remove();
网友回复
- threejs如何做个三维搭积木的游戏?
- three如何实现标记多个起始路过地点位置后选择旅行工具(飞机汽车高铁等),最后三维模拟行驶动画导出mp4?
- ai实时驱动的3d数字人可视频聊天的开源技术有吗
- swoole+phpfpm如何实现不同域名指向不同目录的多租户模式?
- 如何用go替换nginx实现请求phpfpm解析运行php脚本?
- 有没有浏览器离线运行进行各种文档、图片、视频格式转换的开源工具?
- 如何使用go语言搭建一个web防火墙?
- linux如何检测特定网络协议比如http协议中报文是否包含特点关键词并阻止返回给客户?
- 如果在nginx外过滤包含某些关键词的网页并阻止打开?
- 程序员怎么做副业赚钱?



 
				 
			 
			 
				 
			