从流读取时的 NodeJs 可读错误
NodeJs Readable Error When Reading From Stream
我想每 1 秒打印一次输出,但出现以下错误。我认为 read 方法是同步调用的,但似乎并非如此。谁能解释一下 read 方法是如何执行的以及为什么会出现此错误?
const {Readable} = require('stream');
var out = new Readable({
read(size){
console.log('read');
setTimeout(()=>{
console.log(this.k);
console.log('before push');
this.push(String.fromCharCode(this.k++)+'\n');
console.log('after push\n');
if(this.k>65){
this.push(null);
console.log('null\n');
}
},1000);
}
});
out.k = 65;
out.pipe(process.stdout);
我得到这个错误:
events.js:183
throw er; // Unhandled 'error' event
^
Error: stream.push() after EOF
at readableAddChunk (_stream_readable.js:240:30)
at Readable.push (_stream_readable.js:208:10)
at Timeout.setTimeout [as _onTimeout] (C:\Users\x90540\Node\index.js:106:14)
at ontimeout (timers.js:475:11)
at tryOnTimeout (timers.js:310:5)
at Timer.listOnTimeout (timers.js:270:5)
当您推送 null
时,您正在关闭流,但您没有清除超时,因此您正在尝试在关闭的流上写入。像这样尝试:
const { Readable } = require('stream');
var prevTimeout;
var out = new Readable({
read(size) {
prevTimeout = setTimeout(()=> {
console.log(this.k);
this.push(String.fromCharCode(this.k++)+'\n');
if (this.k > 67) {
this.push(null);
clearTimeout(prevTimeout);
}
},
500);
}
});
out.k = 65;
out.pipe(process.stdout);
关于流的更多信息:https://nodejs.org/api/stream.html#stream_readable_streams
对于以后来看这篇文章的人:
如果您使用更新版本的 Node,则不会重现此行为。可以在此处找到对此的详细讨论:
https://github.com/nodejs/node/issues/3203#issuecomment-355137794
我想每 1 秒打印一次输出,但出现以下错误。我认为 read 方法是同步调用的,但似乎并非如此。谁能解释一下 read 方法是如何执行的以及为什么会出现此错误?
const {Readable} = require('stream');
var out = new Readable({
read(size){
console.log('read');
setTimeout(()=>{
console.log(this.k);
console.log('before push');
this.push(String.fromCharCode(this.k++)+'\n');
console.log('after push\n');
if(this.k>65){
this.push(null);
console.log('null\n');
}
},1000);
}
});
out.k = 65;
out.pipe(process.stdout);
我得到这个错误:
events.js:183
throw er; // Unhandled 'error' event
^
Error: stream.push() after EOF
at readableAddChunk (_stream_readable.js:240:30)
at Readable.push (_stream_readable.js:208:10)
at Timeout.setTimeout [as _onTimeout] (C:\Users\x90540\Node\index.js:106:14)
at ontimeout (timers.js:475:11)
at tryOnTimeout (timers.js:310:5)
at Timer.listOnTimeout (timers.js:270:5)
当您推送 null
时,您正在关闭流,但您没有清除超时,因此您正在尝试在关闭的流上写入。像这样尝试:
const { Readable } = require('stream');
var prevTimeout;
var out = new Readable({
read(size) {
prevTimeout = setTimeout(()=> {
console.log(this.k);
this.push(String.fromCharCode(this.k++)+'\n');
if (this.k > 67) {
this.push(null);
clearTimeout(prevTimeout);
}
},
500);
}
});
out.k = 65;
out.pipe(process.stdout);
关于流的更多信息:https://nodejs.org/api/stream.html#stream_readable_streams
对于以后来看这篇文章的人:
如果您使用更新版本的 Node,则不会重现此行为。可以在此处找到对此的详细讨论:
https://github.com/nodejs/node/issues/3203#issuecomment-355137794