使用stream.Readable.from时为何可读流块顺序错乱?
问题
我原本以为读取块时会从'applesauce'、'blueberry'等开始,但实际用于初始创建流的可迭代对象内容始终排在最后而非首位,尽管push的内容顺序正确。为什么会出现这种顺序?
代码示例
import stream from 'node:stream'; const a = stream.Readable.from(['applesauce', 'blueberry', 'muffins']); a.push('one'); a.push('two'); a.push('three'); a.push('333'); a.push('555'); a.push('777'); for await (const chunk of a) { console.log(chunk); }
输出结果
one two three 333 555 777 applesauce blueberry muffins
解答
这是因为stream.Readable.from()创建的可读流,会把传入的可迭代对象数据安排成后备填充源,而你调用a.push()添加的内容会直接进入当前缓冲区,优先级更高。
具体逻辑是:
- 用
Readable.from()初始化流时,Node.js不会立刻把可迭代对象的所有数据塞进缓冲区,而是把遍历这个可迭代对象的逻辑绑定到流的_read方法里。只有当流的内部缓冲区被消费空了之后,才会触发_read去遍历初始可迭代对象,把数据逐步填充进来。 - 你在创建流后立即调用
push(),这些数据会被直接添加到当前缓冲区中,流会优先读取缓冲区里的现有数据,直到缓冲区空了,才会去处理初始可迭代对象的内容。
简单总结:push的内容先进入缓冲区先被读取,初始可迭代对象的内容是“候补数据”,等缓冲区空了才会被读取。
内容的提问来源于stack exchange,提问作者purple-hippo
相关产品推荐
相关产品推荐

