Heim >Web-Frontend >js-Tutorial >Eine kurze Diskussion über Duplex-Streams in Nodejs
Verwandte Empfehlungen: „node js-Tutorial“
Duplex-Stream ist ein Stream, der gleichzeitig lesbar und beschreibbar ist und als Upstream-Produktionsdaten und Downstream-Verbrauchsdaten verwendet werden kann, sodass dies möglich ist in der Datenflusspipeline Der mittlere Teil, nämlich
rs.pipe(rws1).pipe(rws2).pipe(rws3).pipe(ws);
Es gibt zwei häufig verwendete Duplex-Streams in NodeJS
Duplex
Transform
Implementierung Duplex
und lesbar, Beschreibbare Implementierungsmethode Ebenso ist die Implementierung des Duplex-Streams sehr einfach, aber Duplex implementiert sowohl Readable als auch Writable. NodeJS unterstützt keine Mehrfachvererbung, daher müssen wir die Duplex-Klasse erben
Die Duplex-Klasse erben
implementieren ()-Methode
Implementierung der _write()-Methode
Ich glaube, jeder ist mit der Implementierung der read()- und write()-Methoden vertraut, da sie genau mit Readable und Writable identisch sind.
const Duplex = require('stream').Duplex; const myDuplex = new Duplex({ read(size) { // ... }, write(chunk, encoding, callback) { // ... } });
Konstruktorparameter
Die Duplex-Instanz enthält sowohl lesbare als auch beschreibbare Streams. Beim Instanziieren der Duplex-Klasse können Sie mehrere Parameter übergeben
Kleines Beispiel
Nachdem Sie Readable und Writable verstanden haben, ist es sehr einfach, sich Duplex anzusehen. Verwenden Sie einfach ein Beispiel von der offiziellen Website
const Duplex = require('stream').Duplex; const kSource = Symbol('source'); class MyDuplex extends Duplex { constructor(source, options) { super(options); this[kSource] = source; } _write(chunk, encoding, callback) { // The underlying source only deals with strings if (Buffer.isBuffer(chunk)) chunk = chunk.toString(); this[kSource].writeSomeData(chunk); callback(); } _read(size) { this[kSource].fetchSomeData(size, (data, encoding) => { this.push(Buffer.from(data, encoding)); }); } }
Natürlich ist dies Pseudocode, der nicht ausgeführt werden kann, aber die Rolle von Duplex ist deutlich zu erkennen und kann Daten erzeugen und Daten verbrauchen, sodass es sich in der Mitte der Datenflusspipeline befinden kann. Zu den gängigen Duplex-Streams gehört
Transform implementieren
Die Transform-Klasse erbt intern Duplex und implementiert die Methoden writable.write() und readable._read(). Wenn wir einen Transform-Stream anpassen möchten, müssen wir nur
die Transform-Klasse erbenImplementieren Sie die _transform()-Methode
transform.prototype._transform = function (data, encoding, callback) { this.push(data); callback(); }; transform.prototype._transform = function (data, encoding, callback) { callback(null, data); };Manchmal muss der Transformationsvorgang am Ende des Streams möglicherweise weitere Daten in den beschreibbaren Stream schreiben. Zlib-Streams speichern beispielsweise einen internen Status, um die komprimierte Ausgabe zu optimieren. In diesem Fall kann die Methode _flush() verwendet werden, die aufgerufen wird, bevor alle geschriebenen Daten verbraucht sind und „Ende“ ausgelöst wird. TransformationsereignisTransformationsstrom hat zwei häufig verwendete Ereignisse Beendet von Beschreibbar
TCP-Socket
intuitiv zu verstehen
net 模块可以用来创建 socket,socket 在 NodeJS 中是一个典型的 Duplex,看一个 TCP 客户端的例子
var net = require('net'); //创建客户端 var client = net.connect({port: 1234}, function() { console.log('已连接到服务器'); client.write('Hi!'); }); //data事件监听。收到数据后,断开连接 client.on('data', function(data) { console.log(data.toString()); client.end(); }); //end事件监听,断开连接时会被触发 client.on('end', function() { console.log('已与服务器断开连接'); });
可以看到 client 就是一个 Duplex,可写流用于向服务器发送消息,可读流用于接受服务器消息,两个流内的数据并没有直接的关系。
gulp
gulp 非常擅长处理代码本地构建流程,看一段官网的示例代码
gulp.src('client/templates/*.jade') .pipe(jade()) .pipe(minify()) .pipe(gulp.dest('build/minified_templates'));
其中 jada() 和 minify() 就是典型的 Transform,处理流程大概是
.jade 模板文件 -> jada() -> html 文件 -> minify -> 压缩后的 html
可以看出来,jade() 和 minify() 都是对输入数据做了些特殊处理,然后交给了输出数据。
这样简单的对比就能看出 Duplex 和 Transform 的区别,在平时实用的时候,当一个流同事面向生产者和消费者服务的时候我们会选择 Duplex,当只是对数据做一些转换工作的时候我们便会选择使用 Tranform。
更多编程相关知识,请访问:编程学习网站!!
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über Duplex-Streams in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!