Knotenstrom hat 4 Typen: 1. Lesbar (lesbarer Strom). Die Methode „_read“ muss implementiert werden, um Inhalte zurückzugeben. 2. Beschreibbar (beschreibbarer Stream); die Methode „_write“ muss implementiert werden, um Inhalte zu akzeptieren; 3. Duplex (lesbarer und beschreibbarer Stream); _write“-Methoden müssen implementiert werden, um Inhalte zu akzeptieren und zurückzugeben; 4. Transformieren (Konvertierungsstream), Sie müssen die „_transform“-Methode implementieren, um den empfangenen Inhalt zu konvertieren und den Inhalt zurückzugeben.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, NodeJS Version 16, DELL G3-Computer.
Stream ist ein sehr grundlegendes Konzept in Nodejs. Viele Grundmodule werden auf Basis von Streams implementiert und spielen eine sehr wichtige Rolle. Gleichzeitig ist Flow auch ein sehr schwer zu verstehendes Konzept. Dies liegt vor allem an der fehlenden relevanten Dokumentation. Für NodeJs-Anfänger dauert es glücklicherweise oft lange, den Flow zu verstehen. Für die meisten NodeJs wird es von Benutzern nur zum Entwickeln von Webanwendungen verwendet. Ein unzureichendes Verständnis von Streams hat keinen Einfluss auf deren Verwendung. Das Verständnis von Streams kann jedoch zu einem besseren Verständnis anderer Module in NodeJs führen, und in einigen Fällen liefert die Verwendung von Streams zur Datenverarbeitung bessere Ergebnisse.
Stream ist eine abstrakte Schnittstelle zur Verarbeitung von Streaming-Daten in Node.js. Stream ist keine eigentliche Schnittstelle, sondern ein allgemeiner Begriff für alle Streams. Die eigentlichen Schnittstellen sind ReadableStream, WritableStream und ReadWriteStream.
interface ReadableStream extends EventEmitter { readable: boolean; read(size?: number): string | Buffer; setEncoding(encoding: BufferEncoding): this; pause(): this; resume(): this; isPaused(): boolean; pipe<T extends WritableStream>(destination: T, options?: { end?: boolean | undefined; }): T; unpipe(destination?: WritableStream): this; unshift(chunk: string | Uint8Array, encoding?: BufferEncoding): void; wrap(oldStream: ReadableStream): this; [Symbol.asyncIterator](): AsyncIterableIterator<string | Buffer>; } interface WritableStream extends EventEmitter { writable: boolean; write(buffer: Uint8Array | string, cb?: (err?: Error | null) => void): boolean; write(str: string, encoding?: BufferEncoding, cb?: (err?: Error | null) => void): boolean; end(cb?: () => void): this; end(data: string | Uint8Array, cb?: () => void): this; end(str: string, encoding?: BufferEncoding, cb?: () => void): this; } interface ReadWriteStream extends ReadableStream, WritableStream { }
Es ist ersichtlich, dass ReadableStream und WritableStream beide Schnittstellen sind, die die EventEmitter-Klasse erben (Schnittstellen in ts können Klassen erben, da es sich nur um zusammengeführte Typen handelt).
Die Implementierungsklassen, die den oben genannten Schnittstellen entsprechen, sind Readable, Writable und Duplex.
Es gibt 4 Arten von Streams in NodeJs:
Readable Readable Stream (Implementierung von ReadableStream)
Writable Stream ( Implementierung writablestream)
Uplex lesbarer und beschreibbarer Stream (implementieren Sie Writablestream nach dem Erben nach lesbar). implementierte_ Lesemethode, um Inhalte zurückzugeben
Writable muss die _write-Methode implementieren, um Inhalte zu akzeptieren Wenn der Inhalt konvertiert wird, wird
Readable
Readable.read()
muss explizit aufgerufen werden, um Daten aus dem Puffer zu lesen. Dadurch wird eine Antwort auf das EventEmitter-Ereignis ausgelöst. readableFlowing === true (Fließmodus)
readable.readableFlowing
des Flusses null
und wird nach dem Hinzufügen des Datenereignisses wahr. Wenn pause()
, unpipe()
aufgerufen wird, Gegendruck empfangen wird oder ein readable
-Ereignis hinzugefügt wird, readableFlowing</code > will ist auf „false“ gesetzt, </p>In diesem Zustand wird durch das Binden eines Listeners für das Datenereignis readableFlowing nicht auf „true“ gesetzt</li>. <li><p>Rufen Sie <code>resume()
auf, um das readableFlowing
des lesbaren Flusses auf true zu setzen. Readable.read()
方法来从缓冲区中读取数据,read 会触发响应到 EventEmitter 事件。
三种状态:
readableFlowing === null(初始状态)
readableFlowing === false(暂停模式)
readableFlowing === true(流动模式)
初始时流的 readable.readableFlowing
为 null
添加data事件后变为 true 。调用 pause()
、unpipe()
、或接收到背压或者添加 readable
事件,则 readableFlowing
会被设为 false ,在这个状态下,为 data 事件绑定监听器不会使 readableFlowing 切换到 true。
调用 resume()
可以让可读流的 readableFlowing
Das Entfernen aller lesbaren Ereignisse ist die einzige Möglichkeit, readableFlowing auf null zu setzen.
Beschreibung | |
---|---|
Wird ausgelöst, wenn neue lesbare Daten im Puffer vorhanden sind (wird für jeden in den Cache eingefügten Knoten ausgelöst). Das wird es Der Parameter wird jedes Mal ausgelöst, wenn der Stream geschlossen wird. Beschreibung: | |
verbraucht Daten mit einer Länge Die Rückgabe von Null bedeutet, dass die aktuellen Daten kleiner als die Größe sind. Andernfalls werden die dieses Mal verbrauchten Daten zurückgegeben. Wenn die Größe nicht übergeben wird, bedeutet dies, dass alle Daten im Cache-Pool verbraucht werden | |