Node.js`Stream`和块顺序

Node.js`Stream`和块顺序,node.js,stream,Node.js,Stream,Node.jsstreams顺序是否保留了'data'事件?我相信它们是正确的,而且似乎至少表明pipe方法是顺序的 我希望保留块顺序,以便在流结束之前调用对每个块进行操作的函数,即,在读取流的一部分时,我希望缓冲数据块由'data'事件中的函数处理 但是,当我运行以下代码时,我使用了Math.random和setTimeout专门测试事件是否按顺序发生: fs.createReadStream(filePath, { encoding: 'ascii' }) .pipe(streamToE

Node.js
stream
s顺序是否保留了
'data'
事件?我相信它们是正确的,而且似乎至少表明
pipe
方法是顺序的

我希望保留块顺序,以便在流结束之前调用对每个块进行操作的函数,即,在读取流的一部分时,我希望缓冲数据块由
'data'
事件中的函数处理

但是,当我运行以下代码时,我使用了
Math.random
setTimeout
专门测试事件是否按顺序发生:

fs.createReadStream(filePath, { encoding: 'ascii' })
  .pipe(streamToEntry)
  .on('data', (chunk) => {
    setTimeout(() => { 
      console.log(chunk); 
    }, Math.random() * 1000)
  });
数据块可以无序记录


这是因为
setTimeout()
还是因为
'data'
事件不一定按顺序调用?i、 例如,应该只在
管道
方法中进行有序处理,还是可以在末尾按顺序处理数据

您的
数据
事件保证按顺序发出。有关更多详细信息和节点源代码中的一些片段,请参见,这表明您将按顺序获得
数据
事件

数据
回调中添加异步代码时会出现问题(
setTimeout
是异步代码的一个示例)。在这种情况下,
数据
回调不能保证按照调用顺序完成处理

您需要做的是确保在
数据
回调返回时,您已经完全处理了数据。换句话说,回调代码需要是同步代码

fs.createReadStream(filePath, { encoding: 'ascii' })
  .pipe(streamToEntry)
  .on('data', (chunk) => {
      // only synchronous code here
      console.log(chunk); 
  });
要使问题代码正常工作,可以使用
async
/
wait

fs.createReadStream(filePath, { encoding: 'ascii' })
  .pipe(streamToEntry)
  .on('data', async (chunk) => {
      // only synchronous code here
      await setTimeout(() => console.log(chunk), Math.random() * 1000); 
  });

在不设置超时的情况下尝试,然后查看。记住,setTimeout不能保证回调何时运行;它可能发生在你的1000周期的任何一边。再加上你对每个块都使用了一个随机延迟,那么它们肯定会超出范围order@sofcal
Math.random
用于测试它们是否会出现故障-这当然不是针对任何特定功能:)如果没有
setTimeout
,它似乎可以工作。但这可能是因为
console.log
不是密集型的。也许用强化的方法,它会偶尔发生故障。正如所怀疑的,谢谢你。如果有人真的有遇到这个问题的
setTimeout
用例,我将在您的回答中添加一点帮助上述代码工作的内容