この質問は、読み取り可能なストリームの読み取りメソッドを実際に実装する方法です。
私はこのReadableストリームの実装を持っています:
import {Readable} from "stream";
this.readableStream = new Readable();
このエラーが発生しています
events.js:136スローer; //未処理の「エラー」イベント^
エラー[ERR_STREAM_READ_NOT_IMPLEMENTED]:_read()は、Readable._read(_stream_reader.js:554:22)で実装されていません。 (internal/process/next_tick.js:138:11)at process._tickCallback(internal/process/next_tick.js:180:9)at Function.Module.runMain(module.js:684:11)at startup(bootstrap_node。 js:191:16)at bootstrap_node.js:613:3
エラーが発生する理由は明らかです。これを行う必要があります。
this.readableStream = new Readable({
read(size) {
return true;
}
});
Readメソッドの実装方法がよくわかりません。
機能するのは、呼び出すだけです
this.readableStream.Push('some string or buffer');
私がこのようなことをやろうとすると:
this.readableStream = new Readable({
read(size) {
this.Push('foo'); // call Push here!
return true;
}
});
その後、何も起こりません-読み取り可能なものから何も出てきません!
さらに、これらの記事では、readメソッドを実装する必要はないと述べています。
https://github.com/substack/stream-handbook#creating-a-readable-stream
https://medium.freecodecamp.org/node-js-streams-everything-you-need-to-know-c9141306be9
私の質問はです-なぜreadメソッド内でPushを呼び出しても何も起こりませんか?私のために働く唯一のものは、他の場所でreadable.Push()を呼び出すことだけです。
なぜreadメソッド内でPushを呼び出しても何も起こらないのですか?私のために機能する唯一のものは、他の場所でreadible.Push()を呼び出すことだけです。
それはあなたがそれを消費していないからだと思います、それを書き込み可能なストリーム(例えばstdout)にパイプするか、単にdata
イベントを通して消費する必要があります:
const { Readable } = require("stream");
let count = 0;
const readableStream = new Readable({
read(size) {
this.Push('foo');
if (count === 5) this.Push(null);
count++;
}
});
// piping
readableStream.pipe(process.stdout)
// through the data event
readableStream.on('data', (chunk) => {
console.log(chunk.toString());
});
どちらも5回印刷する必要がありますfoo
(ただし、多少異なります)。どちらを使用するかは、達成しようとしていることに依存します。
さらに、これらの記事では、readメソッドを実装する必要はないと述べています。
あなたはそれを必要としないかもしれません、これはうまくいくはずです:
const { Readable } = require("stream");
const readableStream = new Readable();
for (let i = 0; i <= 5; i++) {
readableStream.Push('foo');
}
readableStream.Push(null);
readableStream.pipe(process.stdout)
この場合、data
イベントを通じてキャプチャすることはできません。また、この方法はあまり役に立ちませんし、効率的でもありません。ストリーム内のすべてのデータを一度にプッシュし(それが大きい場合は、すべてがメモリに格納される)、それを消費します。
ReadableStreamの初期化後に_read
メソッドを実装します。
import {Readable} from "stream";
this.readableStream = new Readable();
this.readableStream.read = function () {};