web-dev-qa-db-ja.com

_read()は読み取り可能なストリームに実装されていません

この質問は、読み取り可能なストリームの読み取りメソッドを実際に実装する方法です。

私はこの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()を呼び出すことだけです。

10
Alexander Mills

なぜ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イベントを通じてキャプチャすることはできません。また、この方法はあまり役に立ちませんし、効率的でもありません。ストリーム内のすべてのデータを一度にプッシュし(それが大きい場合は、すべてがメモリに格納される)、それを消費します。

5
Antonio Val

ReadableStreamの初期化後に_readメソッドを実装します。

import {Readable} from "stream";
this.readableStream = new Readable();
this.readableStream.read = function () {};
1
user9205225

ドキュメントから:

読み取り可能です。_read:

「readable._read()が呼び出されたときに、リソースからデータが利用可能な場合、実装はthis.Push(dataChunk)メソッドを使用してそのデータを読み取りキューにプッシュし始める必要があります。 link "

読み取り可能です。プッシュ:

「readable.Push()メソッドは、Readableインプリメンターだけが、そしてreadable._read()メソッド内からのみ呼び出されることを意図しています。 link "

それが役に立てば幸い :)

1
i474232898