关于 Nodejs node stream 生命周期的问题
关于 Nodejs node stream 生命周期的问题
对 stream 的一些问题感到迷惑,还是直接上代码吧:
let fs = require('fs');
const Readable = require('stream').Readable;
const util = require('util');
util.inherits(MyReadable, Readable);
function MyReadable(source,options){
Readable.call(this, options);
this._source = source;
source.on('readable', () => {
//注释下面这行
this.read(0); //FLAG
});
}
var b = true;
MyReadable.prototype._read = function(){
let chunk = this._source.read();
if(b){
if(!chunk){
return this.push('');
}else{
b=false;
}
}
if(chunk){
this.push(chunk);
}else{
this.push(null);
}
}
//case1
function getStream(){
var rs = new Readable();
rs.push('abcdefg');
rs.push(null);
return rs;
}
//case2
function getStream2(){
//hello.txt 是包含“ abcdefg ”字符串的文本文件。
return fs.createReadStream('./hello.txt', {encoding: null});
}
var rs = getStream2();
let myrs = new MyReadable(rs);
myrs.pipe(process.stdout);
上面这段代码输出: abcdefg 。 问题一: 如果我把下面这行注释
this.read(0);
则没有任何输出,为什么? 如果改成:
this.read();
好像效果和 this.read(0)一样。
问题二: 如果把 var rs = getStream2(); 改成 var rs = getStream(); 则 FLAG 那行不注释也能有输出,这又是为什么?
求大神赐教。谢谢。
在线等啊。。。
有人吗?
最近我也在学习这部分,发点资料给你参考,我看了几遍还是不清楚
可以多交流。。。
http://fe.meituan.com/stream-basics.html
标准的流是有缓存的,一般都是行缓存
你把 push(‘abcdefg’); 改成 push(‘abcdefg\n’);应该就能输出了,如果我没猜错的话。
当然你也可以手动 flush 一下
关于 Node.js 中 Node Stream 的生命周期问题,这里是一个简要的概述。Node Stream 提供了处理数据流的高效方式,其生命周期主要涵盖创建、可读/可写操作、以及结束几个阶段。
创建阶段
创建一个 Stream 通常通过其构造函数,例如 Readable
或 Writable
:
const { Readable, Writable } = require('stream');
// 创建一个可读流
const readable = new Readable({
read() {
// 实现数据读取逻辑
}
});
// 创建一个可写流
const writable = new Writable({
write(chunk, encoding, callback) {
// 实现数据写入逻辑
callback();
}
});
可读/可写操作
可读流通过 _read
方法提供数据,而可写流通过 _write
方法处理数据。在流的操作过程中,会触发诸如 data
、end
、error
等事件。
结束阶段
流的结束通常通过 end
方法来标记,此时流将不再接受或产生数据。
writable.end('Final data chunk', () => {
console.log('Stream finished writing.');
});
readable.on('end', () => {
console.log('No more data in readable stream.');
});
错误处理
在流的生命周期中,错误处理非常重要,通常通过监听 error
事件来处理:
readable.on('error', (err) => {
console.error('Readable stream error:', err);
});
writable.on('error', (err) => {
console.error('Writable stream error:', err);
});
以上是对 Node Stream 生命周期的基本介绍,希望对你有所帮助。