自己实现一个eventBus

作者: wade3po | 来源:发表于2020-04-29 16:32 被阅读0次

昨天使用了vue提供的事件发布订阅,于是今天就自己实现了一个,发现没有太大难度,直接上代码:

function EventBus() {}

EventBus.prototype.on = function (name, callback) {
 //如果没有事件对象,新增一个
 if(!this._events){
  //创建一个干净的没有原型链的对象
  this._events = Object.create(null);
 }
 //如果没有这个事件的订阅,新增一个,如果有,push进去
 if(!this._events[name]){
  this._events[name] = [callback];
 }else{
  this._events[name].push(callback);
 }
}

EventBus.prototype.emit = function (name, ...args) {
 //发布的时候,如果有这个事件,循环执行所有这个订阅的方法
 if(this._events[name]){
  this._events[name].forEach(callback => {
   callback(...args);
  })
 }
}

EventBus.prototype.off = function (name) {
 //如果有这个事件的订阅,清除所有订阅
 if(this._events[name]){
  delete this._events[name];
 }
}

EventBus.prototype.once = function (name, callback) {
 let once = (...args) => {
  callback(...args);
  this.off(name);
 };
 this.on(name, once);
}

let eventBus = new EventBus();

eventBus.on('on', function (msg) {
 console.log(msg);
})
eventBus.once('once', function (msg) {
 console.log(msg);
})
eventBus.on('off', function (msg) {
 console.log(msg);
})
eventBus.emit('on', '发布on1')//发布on1
eventBus.emit('on', '发布on2')//发布on2
eventBus.emit('once', '发布once')//发布once
eventBus.emit('once', '发布once')
eventBus.emit('off', '发布off')//发布off
eventBus.off('off')
eventBus.emit('off', '发布off')

on、off和emit没什么好说的,就是很简单的发布订阅,代码看一下也都理解了,once这个方法我觉得得理解一下,once方法其实就是执行on,执行一次之后执行off,我们可以采用函数劫持的方法,把订阅的方法劫持了,依然是执行on,但是回调变成自己的,当自己的回调执行之后,off移除这个订阅,这种做法好像也叫切片编程。

EventBus.prototype.once = function (name, callback) {
 let once = (...args) => {
  callback(...args);
  this.off(name);
 };
 this.on(name, once);
}

昨天有人问我eventBus具体应用场景,说实在的,我还真想不出来,兄弟组件之间传值、多层级组件之间传值。比如聊天点击进入一个页面,未读消息这种,大部分是在同一个页面展示,然后不同一个组件的场景才用得到,或者不同页面销毁一些会造成内存泄漏的场景。eventBus能解决的都有其它方法可以解决,其它方法也可以用eventBus解决,或许以后用到了eventBus之后,会觉得很香吧。

image

相关文章

  • 自己实现一个eventBus

    什么是发布/订阅模式? 一张图来解释: 发布者发布一项内容给控制中心 控制中心将内容发送给对应的订阅者 当我们需...

  • 自己实现一个eventBus

    昨天使用了vue提供的事件发布订阅,于是今天就自己实现了一个,发现没有太大难度,直接上代码: on、off和emi...

  • EventBus源码解析

    知识点汇总: 一:EventBus框架概述 二:EventBus的注册实现原理 三:EventBus的事件分发实现...

  • 如何自己实现一个 EventBus

    什么是 EventBus EventBus 是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实...

  • vue兄弟组件之间通信--eventBus

    原文地址 eventBus eventBus单独的事件中心,用来管理组件之间的通信。 由于 Vue 实例实现了一个...

  • 动手造轮子:实现一个简单的 EventBus

    动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 Even...

  • [Flutter]EventBus的使用和底层实现分析

    什么是EventBus EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,...

  • EventBus的使用

    什么是EventBus EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,...

  • 一个eventBus

    vue实现一个eventBus eventBus应该有些听过,其实就是一个事件发布订阅的功能。vue提供了实例方法...

  • EventBus

    一、EventBus的原理 EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访...

网友评论

    本文标题:自己实现一个eventBus

    本文链接:https://www.haomeiwen.com/subject/yalnwhtx.html