Skip to content

事件与本地投递

单一负载类型选择类型化总线,多种具名事件选择 EventBus<Events>。这些实现不持久化事件、不重试投递,也不会把处理器失败转换成业务事务失败。

后续本地工作依赖监听器完成时,应等待 emit。它只表示完成,不表示成功确认:内置总线会捕获监听器错误。发布方若需要某项操作的成功结果或失败,应直接调用该操作,而不是使用事件通知。

事件与订阅契约

EventType = stringEventHandler<EVENT> 必填 name: stringhandle(event): void | Promise<void>;串行排序中可选 order 默认零,可选 once 默认 false。TypedEventBus<EVENT> 提供 typehandlersonoffemitdestroy

方法返回值契约
on(handler)boolean已有同名处理器时返回 false。
off(name)boolean缺失返回 false,移除影响后续 emit。
handlersEventHandler<EVENT>[]数组副本,仍包含原处理器对象。
emit(event)Promise<void>按选定策略等待处理器结束。
destroy()void本地总线清空处理器,没有禁止再次使用的终止状态。

每次 emit 快照处理器数组,并在调用任何处理器前移除所有 once 注册,因此并发/重入 emit 不会重复投递同一个 once 注册。投递期间增删订阅不会改变当前投递的快照。

串行与并行

new SerialTypedEventBus<EVENT>(type) 按 order 升序排列,在单次 emit 内依次等待处理器。并发 emit 不会全局排队,不同事件的处理器可以重叠。new ParallelTypedEventBus<EVENT>(type) 使用 Promise.all 启动处理器,不按 order 排序,也不保证完成顺序。

两者继承 AbstractTypedEventBus<EVENT>。它的 protected handleEvent 捕获同步抛错和异步拒绝,输出 console.warn 后继续。因此内置本地 emit 即使有处理器失败也会完成。子类提供 typeonoffemit,可复用此错误边界。总线不聚合处理器结果,也不隐式取消其他处理器。

多事件路由

new EventBus<Events>(typeEventBusSupplier: TypeEventBusSupplier) 仅在 on(type, handler) 时延迟创建对应总线。TypeEventBusSupplier(type: EventType) => TypedEventBus<unknown>。总线不存在时 off(type, name) 返回 false;emit(type, event): void | Promise<void> 返回 undefined,不缓存事件。destroy() 销毁所有已创建总线并清空 Map。键使用字符串泛型,应使用固定事件映射与正确名称,不要将类型视为运行时校验。

NameGenerator.generate(prefix): stringDefaultNameGenerator 实现;实例级计数器生成 prefix_1prefix_2 等。nameGenerator 是共享实例。名称用于本地注册标识,并非全局唯一 ID。

完整示例

ts
import { EventBus, SerialTypedEventBus } from '@ahoo-wang/fetcher-eventbus';

type Events = { saved: { id: string }; signedOut: undefined };
const bus = new EventBus<Events>(
  type => new SerialTypedEventBus<unknown>(type),
);
const received: string[] = [];
bus.on('saved', {
  name: 'audit',
  order: 0,
  once: true,
  handle: event => {
    received.push(event.id);
  },
});
await bus.emit('saved', { id: '1' });
await bus.emit('saved', { id: '2' });
console.assert(received.join(',') === '1');
bus.destroy();

公开符号与源码

符号实现
AbstractTypedEventBusabstractTypedEventBus.ts:17
TypeEventBusSuppliereventBus.ts:20
EventBuseventBus.ts:35
NameGeneratornameGenerator.ts:17
DefaultNameGeneratornameGenerator.ts:24
nameGeneratornameGenerator.ts:41
ParallelTypedEventBusparallelTypedEventBus.ts:33
SerialTypedEventBusserialTypedEventBus.ts:34
TypedEventBustypedEventBus.ts:21
EventTypetypes.ts:17
EventHandlertypes.ts:19

包索引

基于 Apache License 2.0 发布。