篇章二 · 2.1
AsyncGenerator 流式管道
篇章二进心脏。先建立这门课最重要的一个心智模型:从 API 到你的终端,数据流过五层「能暂停的函数」。后面三站都是在某一层里放大看。
整个系统,是一条套一条的传送带
Claude Code 里没有「调一次 API 拿完整结果」这回事。模型每吐出一个 token 片段,消息就沿着五层 AsyncGenerator 逐层上浮,每层都能看一眼、改一改、或者喊停。
30 秒懂 AsyncGenerator
普通函数:调用 → 干完 → 一次性返回。AsyncGenerator(async function*):每算出一件东西就 yield 出去等下游来取,取一件给一件,随取随有——像流水线上一个一个传下来的零件。
async function* source() {
yield '第 1 块'; // 吐出来,停住,等下游取
yield '第 2 块';
}
for await (const item of source()) { console.log(item) } // 逐件消费 关键在嵌套:外层用 yield* 接管内层,数据就穿过多层——每层都是中间商。
withRetry最内层 · 出错时拦截重试
API StreamSSE 事件 → 消息块
queryLoop组装一轮对话
QueryEngine会话状态管理
REPLReact/Ink 逐字渲染
⚡ retry: attempt 2, waiting 1.0s…
▌token
这个设计买到三种能力
01
可拦截
任何中间层都能对路过的数据做变换:API 层把 SSE 增量攒成消息块,压缩层把旧工具结果清空替换。
02
可注入
中间层能自己造消息塞进流里:重试层 yield 一条「正在重试(第2次)…」的状态消息,UI 立刻显示——不用任何全局事件总线。
03
可取消
你按 Esc 中断回答,一个 AbortController 信号沿管道逐层传播,每一层收到信号就地释放资源。没有 kill -9 式的粗暴终止。
本站要点:记住「传送带」这个模型——流式、拦截、注入、取消,全部由同一个机制买单。下一站我们钻进第三层 queryLoop,看这条传送带的「驱动轮」:一个 while(true) 循环。