eventBus 是一个轻量级的发布/订阅事件总线,主要用于组件之间的松耦合通信。它的原理如下:
订阅事件:调用 bus.on() 方法订阅某个事件,传入事件名和回调函数。
1
2
3eventBus.on('eventName', function(data) {
// 处理事件逻辑
})发布事件:调用 bus.emit() 方法发布事件,传入事件名和数据。
1
eventBus.emit('eventName', data)
eventBus 会将订阅了该事件的回调函数执行,并传入发布事件的数据。一个简单的例子:
1
2
3
4
5
6
7
8
9import eventBus from './eventBus.js';
// 订阅事件
eventBus.on('eventName', data => {
console.log(data) // 1
})
// 发布事件
eventBus.emit('eventName', 1)
eventBus.js
eventBus 的代码,用于引入
1 | class EventBus { |
它的工作原理是这样的:
- 当调用 on(eventName, handler) 时,handler 函数会被立即注册到 eventBus 中。
- 当调用 emit(eventName) 时,eventBus 会立即执行以下操作:
- 获取 eventName 对应的所有 handler 函数
- 在当前执行调用栈中,逐个执行这些 handler 函数这意味着 emit 执行的过程中,所有订阅者的函数都会被调用并执行。举个例子:
1 | eventBus.on("hello", () => { |
执行以上代码后,会立即输出:
1 | Hello A |
这是因为 eventBus.emit(“hello”) 执行的时候,直接调用了两个 handler 函数。所以订阅者可以及时收到消息,不是因为 setTimeout 或者定时器,而是 emit 同步执行了所有订阅函数。
once 的原理是:
- once() 方法会创建一个内部的 onceHandler 函数
- onceHandler 会先执行传入的 handler 函数,然后调用 off() 移除自身
- 最终 onceHandler 只会执行一次