Skip to content

EventBus API ​

EventBus 可以独立创建,也可以通过 NApp 的 app.bus 使用。

js
import { EventBus } from "@nyirusu/nasdk"

const bus = new EventBus()

emit ​

发布事件,并同步分发给当前所有匹配的 Listener。

ts
bus.emit(key, payload, thisArg?)
参数说明
key具体事件名,不能包含 *
payload传给 Listener 的业务载荷
thisArg可选,作为本次 Listener callback 的 this
js
bus.emit("task:done", { taskId: "task-1" })

emit() 不返回 Listener 的结果,也不会等待异步 Listener 完成。

listen ​

持续监听事件。

ts
const listenerId = bus.listen(key, callback)

callback 的第二个参数 hitKey 是本次实际命中的事件名。每次 listen() 都会返回独立的 Listener ID。

js
const listenerId = bus.listen("task:*", (payload, hitKey) => {
  console.log(hitKey, payload)
})

listenOnce ​

监听一次事件,首次匹配后自动移除。

ts
const listenerId = bus.listenOnce(key, callback)

返回的 Listener ID 可用于在事件触发前调用 off()。

asyncListenOnce ​

以 Promise 等待一次事件。

ts
const result = await bus.asyncListenOnce(key, callback?)

不提供 callback 时,Promise 返回事件载荷:

js
const pending = bus.asyncListenOnce("task:done")
bus.emit("task:done", { result: 42 })

console.log((await pending).result)

提供 callback 时,Promise 返回 callback 的结果:

js
const pending = bus.asyncListenOnce("task:done", (payload) => payload.result)

bus.emit("task:done", { result: 42 })
console.log(await pending) // 42

callback 抛错或返回 rejected Promise 时,asyncListenOnce() 会 reject。

off ​

通过 Listener ID 解除监听。

ts
const removed = bus.off(listenerId)
  • true:Listener 已移除。
  • false:Listener 不存在或已经移除。

readonly ​

bus.readonly 返回只读的观察接口:

js
const observer = bus.readonly

const listenerId = observer.listen("task:*", callback)
observer.off(listenerId)

它提供 listen()、listenOnce()、asyncListenOnce() 和 off(),不提供 emit()。

readonlyView ​

readonlyView() 为传给 Listener 的 thisArg 提供浅层只读代理。

js
import { readonlyView } from "@nyirusu/nasdk/EventBus"

bus.emit("task:done", payload, readonlyView(task))

它禁止修改、定义或删除根级属性,但不会递归保护嵌套对象。对象方法仍会绑定并调用原对象,因此也可能产生副作用。

onError ​

普通 Listener 抛错或返回 rejected Promise 时,异常会交给 onError:

js
bus.onError = (key, error) => {
  console.error(key, error)
}

异常不会中断其他 Listener,也不会由 emit() 向外抛出。

同一个事件桶超过 50 个 Listener 时,也会通过 onError 发出可能泄漏的提示。

Released under the MIT License.