下面举例说明了一个双工流的简单示例,它封装了一个可以写入数据的假设的底层源对象,并且可以从中读取数据,尽管使用的是与 Node.js 流不兼容的 API。 下面举例了一个双工流的简单示例,它通过可读流接口读回可写流接口的 buffer 传入的写入数据。
const { Duplex } = require('stream');
const kSource = Symbol('source');
class MyDuplex extends Duplex {
constructor(source, options) {
super(options);
this[kSource] = source;
}
_write(chunk, encoding, callback) {
// 底层资源只处理字符串。
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));
});
}
}
双工流最重要的方面是,可读端和可写端相互独立于彼此地共存在同一个对象实例中。