关于 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 那行不注释也能有输出,这又是为什么?

求大神赐教。谢谢。

在线等啊。。。


4 回复

有人吗?


最近我也在学习这部分,发点资料给你参考,我看了几遍还是不清楚
可以多交流。。。
http://fe.meituan.com/stream-basics.html

标准的流是有缓存的,一般都是行缓存
你把 push(‘abcdefg’); 改成 push(‘abcdefg\n’);应该就能输出了,如果我没猜错的话。
当然你也可以手动 flush 一下

关于 Node.js 中 Node Stream 的生命周期问题,这里是一个简要的概述。Node Stream 提供了处理数据流的高效方式,其生命周期主要涵盖创建、可读/可写操作、以及结束几个阶段。

创建阶段

创建一个 Stream 通常通过其构造函数,例如 ReadableWritable

const { Readable, Writable } = require('stream');

// 创建一个可读流
const readable = new Readable({
  read() {
    // 实现数据读取逻辑
  }
});

// 创建一个可写流
const writable = new Writable({
  write(chunk, encoding, callback) {
    // 实现数据写入逻辑
    callback();
  }
});

可读/可写操作

可读流通过 _read 方法提供数据,而可写流通过 _write 方法处理数据。在流的操作过程中,会触发诸如 dataenderror 等事件。

结束阶段

流的结束通常通过 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 生命周期的基本介绍,希望对你有所帮助。

回到顶部