Le flux de nœuds a 4 types : 1. Lisible (flux lisible). La méthode "_read" doit être implémentée pour renvoyer le contenu ; 2. Writable (flux inscriptible), la méthode "_write" doit être implémentée pour accepter le contenu ; 3. Duplex (flux lisible et inscriptible), le "_read" et " Les méthodes _write" doivent être implémentées. Pour accepter et renvoyer le contenu ; 4. Transformation (flux de conversion), vous devez implémenter la méthode "_transform" pour convertir le contenu reçu et renvoyer le contenu.
L'environnement d'exploitation de ce tutoriel : système Windows 7, nodejs version 16, ordinateur DELL G3.
Stream est un concept très basique dans Nodejs. De nombreux modules de base sont implémentés sur la base de flux et jouent un rôle très important. Dans le même temps, le flux est également un concept très difficile à comprendre. Cela est principalement dû au manque de documentation pertinente. Pour les débutants en NodeJ, il faut souvent beaucoup de temps pour comprendre le flux avant de pouvoir réellement maîtriser ce concept. pour la plupart des NodeJ, c'est le cas. Pour les utilisateurs, il n'est utilisé que pour développer des applications Web. Une compréhension insuffisante des flux n'affecte pas leur utilisation. Cependant, comprendre les flux peut conduire à une meilleure compréhension des autres modules de NodeJs et, dans certains cas, l'utilisation de flux pour traiter les données donnera de meilleurs résultats.
Stream est une interface abstraite pour traiter les données en streaming dans Node.js. Stream n'est pas une interface réelle, mais un terme général désignant tous les flux. Les interfaces réelles sont ReadableStream, WritableStream et 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 { }
On peut voir que ReadableStream et WritableStream sont toutes deux des interfaces qui héritent de la classe EventEmitter (les interfaces dans ts peuvent hériter de classes, car ce ne sont que des types de fusion).
Les classes d'implémentation correspondant aux interfaces ci-dessus sont respectivement Readable, Writable et Duplex
Il existe 4 types de flux dans NodeJs :
Readable Readable stream (implémentation de ReadableStream)
Writable stream ( implémentation writeableStream)
Duplex lisible et stream scénarisable (implémenter writeableStream après héritage lisible)
Transformez le flux de conversion (hériter duplex)
EILS ont tous des méthodes à implémenter:
redable doit être implémenté la méthode read pour renvoyer le contenu
Writable doit implémenter la méthode _write pour accepter le contenu
Duplex doit implémenter les méthodes _read et _write pour accepter et renvoyer le contenu
Transform doit implémenter la méthode _transform pour accepter Après le le contenu est converti, il renvoie
Readable stream (Readable) est un type de flux. Il a deux modes et trois états
Deux modes de lecture :
Mode flux : les données circuleront à partir du sous-jacent. Le système lit et écrit dans le tampon. Lorsque le tampon est plein, il transmet automatiquement les données au gestionnaire d'événements enregistré le plus rapidement possible via le mode Pause : dans ce mode, il ne sera pas activement déclenché pour transmettre les données. la méthode Readable.read()
doit être explicitement appelée pour lire les données du tampon. La lecture déclenchera une réponse à l'événement EventEmitter.
Trois états : 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
readableFlowing === null (état initial)
readableFlowing === true (mode fluide) | |
---|---|
Ce sera être déclenché à chaque fois que les données sont consommées. Le paramètre est les données consommées cette fois. Déclenché lorsque le flux est fermé. Déclenché lorsqu'une erreur se produit dans le flux. une longueur de taille. Renvoyer null signifie que les données actuelles sont inférieures à la taille. Sinon, les données consommées cette fois sont renvoyées. Lorsque la taille n'est pas transmise, cela signifie consommer toutes les données du pool de cache |