Node.js`Stream`和块顺序
Node.jsNode.js`Stream`和块顺序,node.js,stream,Node.js,Stream,Node.jsstreams顺序是否保留了'data'事件?我相信它们是正确的,而且似乎至少表明pipe方法是顺序的 我希望保留块顺序,以便在流结束之前调用对每个块进行操作的函数,即,在读取流的一部分时,我希望缓冲数据块由'data'事件中的函数处理 但是,当我运行以下代码时,我使用了Math.random和setTimeout专门测试事件是否按顺序发生: fs.createReadStream(filePath, { encoding: 'ascii' }) .pipe(streamToE
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@sofcalMath.random
用于测试它们是否会出现故障-这当然不是针对任何特定功能:)如果没有setTimeout
,它似乎可以工作。但这可能是因为console.log
不是密集型的。也许用强化的方法,它会偶尔发生故障。正如所怀疑的,谢谢你。如果有人真的有遇到这个问题的setTimeout
用例,我将在您的回答中添加一点帮助上述代码工作的内容