Web Streams 笔记
一、 宏观层:执行与异常模型
核心逻辑: await 是在 try 领土上挖的“地洞”,它暂时交出执行权,但并未脱离监控。
异步迭代 (
for await...of):非阻塞:它是“按需抽水”。当数据没到时,执行权归还浏览器,页面不会卡死。
原理:底层不断调用
reader.read()并等待那个被“调度”的 Promise。异常捕获 (
try...catch):地雷效应:无论流在哪个阶段报错(网络中断、手动 error),所有的
read()Promise 都会被 Reject,从而触发catch。
二、 微观层:字节与内存 (Chunk)
核心逻辑: 流不是数据的副本,而是数据的“接力”。
- Uint8Array:流传输的基础单元。它是 0-255 的字节序列。
- 瞬时性:每次
read()拿到的value是一块内存切片。处理完后,它就会被回收或传给下一级。 - 边界截断:字节流不识语义(可能把一个汉字或单词切断)。需要配合
TextDecoderStream或手动处理remainder逻辑。
三、 调度层:双队列撮合模型 (核心精髓)
这是你理解流为什么能“异步非阻塞”的关键。
1. 内部两个“排队大厅”
- 数据队列 (Chunks Queue):已经生产出来,但还没人领走的“货”。
- 请求队列 (Read Requests Queue):已经发出的
read()请求,但还没货发的“订单(Promise)”。
2. 调度逻辑(模拟代码)
1 | class StreamDispatcher { |
四、 架构层:流水线自动化 (Pipeline)
核心逻辑: 流是模块化的“积木”,通过 pipeThrough 组装。
pipeThrough(transformer):连接管道的“接头”。
TransformStream:独立的加工模组。
writable端接收原始数据。transform逻辑进行加工。readable端吐出成品。链式调用:
stream.pipeThrough(解压).pipeThrough(解码).pipeThrough(JSON解析)。
五、 心智模型总结
- 流是状态机:它有
Readable(可读)、Closed(关掉)、Errored(报废)三种主要状态。 - 读数据不是“拿”而是“约”:
read()返回的 Promise 是你和调度员的一个约定。 - 背压 (Backpressure):当数据队列太满,调度员会告诉生产者“慢点塞”。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 YianNotes!

