迭代器可模拟发布订阅模式:订阅者存入数组,生成器函数逐个yield回调,通过next()按需触发通知,支持异步节流、条件过滤与动态增删,每次publish重新生成迭代器确保列表最新。

可以用迭代器模拟发布订阅模式的核心流程:订阅者注册后,发布者通过迭代逐一通知,无需额外事件总线或回调队列。
用生成器函数管理订阅列表
把订阅者存入数组,用生成器逐个 yield,实现“可暂停、可恢复”的通知过程。这样既保持逻辑清晰,又便于中途控制(比如跳过失效订阅者)。
- 定义一个 subscribers 数组,存放回调函数
- 用 function* 声明生成器函数,遍历并 yield 每个订阅者
- 每次调用 next() 就触发一个订阅者的执行,适合按需推送
发布时驱动迭代器逐个通知
发布动作不是一次性全部调用,而是主动调用迭代器的 next 方法,让每个订阅者按序响应。这天然支持异步节流、条件过滤或中断逻辑。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 调用 iterator.next() 启动通知,返回值含 done 和 value(即回调)
- 检查 done === false 才执行 value(data)
- 可配合 for...of 自动遍历,或手动控制节奏(如加 setTimeout 实现延迟推送)
支持动态增删与状态感知
迭代器本身不保存状态,但可以结合闭包或类封装,让订阅列表变更实时反映在后续迭代中。例如每次生成新迭代器,或用代理拦截数组操作。
- 每次 publish 前重新调用生成器,确保拿到最新订阅者列表
- 订阅函数内可返回布尔值,表示是否继续迭代(类似“取消后续通知”)
- 删除订阅者时,直接从数组中 splice,下一次迭代自然跳过
轻量示例:基础实现
以下是一个最小可行代码片段,不依赖任何库,仅用原生 JS + 生成器:
class EventBus {
constructor() {
this.subscribers = [];
}
subscribe(fn) {
this.subscribers.push(fn);
}
*notifyIterator(data) {
for (const fn of this.subscribers) {
yield fn;
}
}
publish(data) {
const it = this.notifyIterator(data);
for (const fn of it) {
fn(data);
}
}
}
// 使用:
const bus = new EventBus();
bus.subscribe(msg => console.log('A:', msg));
bus.subscribe(msg => console.log('B:', msg));
bus.publish('hello'); // 输出 A: hello 和 B: hello










