EventBus
EventBus 是 NASDK 的进程内事件总线,用于在模块之间发布和监听事件。
EventBus 不与 NApp 绑定,可以作为独立组件直接使用:
import { EventBus } from "@nyirusu/nasdk"
const bus = new EventBus()
const listenerId = bus.listen("task:done", (payload) => {
console.log(payload)
})
bus.emit("task:done", { result: 42 })
bus.off(listenerId)TIP
NApp 本质上是 EventBus 的对外版本,NASDK 的大部分设计都围绕 EventBus 底层消息管线展开。
甚至,应用可以不使用 NApp.request 等任务调用能力,直接通过 app.bus.emit() 发布消息。
并允许本地 app.bus.listen() 或 让其他 NApp 通过 NApp.subscribe 远程订阅这些消息。
NApp以及内部 NACP 和 NACT 使用这个 Bus 发布业务事件、消息流转和生命周期信息。
NACEB、NACAB 等组件也有各自独立的 EventBus,不复用 app.bus。
进程内与远程
emit() 只在当前 EventBus 实例内分发事件,不会自行发送到其他 NApp。
TIP
但是,如果其他NApp订阅了这条消息,还是会发送给远程NApp。
subscribe() 用于订阅远端 NApp 的 EventBus。
订阅建立后,远端的匹配事件会被 NACP 转换为 NotifyMessage 并发送给订阅方:
远端 EventBus.emit()
→ NACP
→ NotifyMessage
→ 本地 callback / streamWARNING
因此,正常业务应先在本地 EventBus 上 emit()。
直接调用 notify() 不会发布 hitSubName 对应的业务事件,因此不会触发该业务事件的本地 Listener。
标准 NACP 消息出站时,会在 app.bus 上发布 nacp:outbound:<type> 观测事件。
DANGER
标准NACP事件可在NACP查看,请注意,ack、notify和response也是标准NACP消息。
因此,如果你尝试订阅nacp:outbound:notify:*,很有可能会导致订阅到即将激活这个监听器的订阅内容,造成消息自激,最终形成消息海啸。
截止NASDK 1.0.4,本特性是已知并且暂时标记为刻意为之的。
事件名
事件名使用 : 分段:
task:done
task:failed
nacp:internal:notify:warning监听时可以使用单段通配符 *:
app.bus.listen("task:*", (payload, hitKey) => {
console.log(hitKey, payload)
})task:* 可以匹配 task:done,但不能匹配 task:step:done。EventBus 不支持 ** 多段通配符。
完整方法见 EventBus API。各事件字段分别见 NApp 可观测、NACP 可观测 和 NACT 可观测。

