aieventjs — 事件系統
This content is not available in your language yet.
import { Aside } from ‘@astrojs/starlight/components’;
aieventjs 是 ai*js 家族的事件發布訂閱核心。與 mitt API 形狀相近,但加入了 ai*js 的生命週期約束:on() 回傳 unsubscribe 函數、AbortSignal 第一級支援、dispose() 冪等且嚴格(呼叫後繼續操作會丟出 EmitterDisposedError)。
pnpm add aieventjsimport { createEmitter } from "aieventjs";
// 用 type(非 interface)宣告事件 maptype Events = { "user:login": { id: string }; "score:tick": { delta: number }; "user:logout": void;};
const bus = createEmitter<Events>();
// on() 回傳 unsubscribe,不需要額外管理 listener referenceconst off = bus.on("user:login", (u) => console.log("hi", u.id));
// 或交給 AbortSignal 管理清理時機const ctrl = new AbortController();bus.on("score:tick", (e) => render(e.delta), { signal: ctrl.signal });
// wildcard * 監聽全部事件,在 type-matched handlers 之後觸發bus.on("*", (type, payload) => trace(type, payload));
// 發送bus.emit("user:login", { id: "alice" });
// 清理off(); // 取消單個訂閱ctrl.abort(); // signal 取消bus.dispose(); // 銷毀整個 emitter(冪等)| 特性 | 說明 |
|---|---|
on() 回傳 unsubscribe | 直接呼叫回傳值即可取消,不需要另存 handler reference |
AbortSignal | 傳入 { signal } 選項,signal abort 時自動移除 listener |
once() | 內建,只觸發一次後自動移除 |
wildcard * | bus.on("*", (type, payload) => ...) |
dispose() 冪等 | 重複呼叫不會拋錯;之後的 on/emit/once 會丟出 EmitterDisposedError |
| 可解構 | const { on, emit } = bus 可正常使用,不依賴 this |
- 與
aifsmjs搭配:FSM 狀態轉移時透過 emitter 廣播給 UI 層 - 與
aiecsjs搭配:ECS system 完成一幀後 emit 事件通知其他模組 - 與
aibridgejs搭配:bridge 的on()事件語義與 aieventjs 形狀一致,方便替換