Skip to content

事件与本地投递 ​

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

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

事件与订阅契约 ​

EventType = string。EventHandler<EVENT> 必填 name: string、handle(event): void | Promise<void>;串行排序中可选 order 默认零,可选 once 默认 false。这些字段与 @ahoo-wang/fetcher 的 NamedCapable、OrderedCapable 一致,但在本包内声明:本包没有依赖。TypedEventBus<EVENT> 提供 type、handlers、on、off、emit、destroy。

方法返回值契约
on(handler)boolean已有同名处理器时返回 false。
off(name)boolean缺失返回 false,移除影响后续 emit。
handlersEventHandler<EVENT>[]按投递顺序的数组副本(串行按 order,并行按注册顺序),仍包含原处理器对象。
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 即使有处理器失败也会完成。子类提供 type、on、off、emit,可复用此错误边界。总线不聚合处理器结果,也不隐式取消其他处理器。

多事件路由 ​

new EventBus<Events>(typeEventBusSupplier: TypeEventBusSupplier) 在某类型首次 on(type, handler) 或 emit(type, event) 时延迟创建对应总线。TypeEventBusSupplier 为 (type: EventType) => TypedEventBus<unknown>。总线不存在时 off(type, name) 返回 false,且不创建总线。emit(type, event) 返回该总线 emit 的 Promise;不缓存事件,因此订阅前的 emit 不会到达本地处理器,但广播 supplier 仍会把它发布到其他标签页。destroy() 销毁所有已创建总线并清空 Map;之后的 on 或 emit 会创建新总线。键使用字符串泛型,应使用固定事件映射与正确名称,不要将类型视为运行时校验。

NameGenerator.generate(prefix): string 由 DefaultNameGenerator 实现;实例级计数器生成 prefix_1、prefix_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:34
SerialTypedEventBusserialTypedEventBus.ts:38
TypedEventBustypedEventBus.ts:21
EventTypetypes.ts:14
EventHandlertypes.ts:22

包索引

基于 Apache License 2.0 发布。