You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:01:32