var fs = require('fs');
var rr = fs.createReadStream('foo.txt');
rr.on('readable', function() {
console.log('readable:', rr.read());
});
rr.on('end', function() {
console.log('end');
});
请阅读文档以获取更多详细信息,因为当流自动切换到“流动模式”时有更多可能性 .
Work with slow handlers and flowing mode:
如果您想要/需要在“流动模式”下工作,还有解决方案 . 您可以暂停和恢复流 . 当您获得chunk form readstream('data')时,暂停流并在完成工作后再恢复它 .
文档示例:
var readable = getReadableStreamSomehow();
readable.on('data', function(chunk) {
console.log('got %d bytes of data', chunk.length);
readable.pause();
console.log('there will be no more data for 1 second');
setTimeout(function() {
console.log('now data will start flowing again');
readable.resume();
}, 1000);
});
1 回答
最后'数据'事件后事件'结束'开火 . 但它可能会在最后一个数据处理程序完成之前发生 . 在一个'数据'处理程序完成之前,可能会启动next . 这取决于您在代码中拥有的内容,但事后“数据”的后续调用可能在之前完成 . 它可能会导致代码中的错误和问题 .
示例如何导致问题(对您自己的测试):
当启动每个'data'事件处理程序时,它将在您的控制台中打印 . 完成后几毫秒 . 完成可能有不同的顺序 .
解决方案:
可读流有两种模式“流动模式”和“暂停模式” . 添加“数据”事件处理程序时,会自动将可读流设置为流动模式 .
从documentation:
在此模式下,事件不会等待您的慢动作完成 . 对于您的需求是'暂停模式' .
从文档:
换句话说:你需要数据块,你得到它,你使用它,当你准备好时,你要求新的数据块 . 在此模式下,您可以控制何时获取数据 .
How to change to 'paused mode' :
它是此流的默认模式 . 但是当你注册'data'事件处理程序时,它会切换到'flowing mode' . 因此,不要使用
readstream.on('data',...)
而是在它触发时使用readstream.on('readable', function(){...})
,这意味着流已准备好提供大量数据 . 要获取大量数据,请使用var chunk = readstream.read();
来自docs的示例:
请阅读文档以获取更多详细信息,因为当流自动切换到“流动模式”时有更多可能性 .
Work with slow handlers and flowing mode:
如果您想要/需要在“流动模式”下工作,还有解决方案 . 您可以暂停和恢复流 . 当您获得chunk form readstream('data')时,暂停流并在完成工作后再恢复它 .
文档示例: