readable._construct(callback)
-
callback
<Function> 当流完成初始化时调用此函数(可选地带有错误参数)。¥
callback
<Function> Call this function (optionally with an error argument) when the stream has finished initializing.
不得直接调用 _construct()
方法。它可能由子类实现,如果是这样,将仅由内部 Readable
类方法调用。
¥The _construct()
method MUST NOT be called directly. It may be implemented
by child classes, and if so, will be called by the internal Readable
class methods only.
这个可选函数将被流构造函数安排在下一个时钟周期,延迟任何 _read()
和 _destroy()
调用,直到调用 callback
。这对于在使用流之前初始化状态或异步初始化资源很有用。
¥This optional function will be scheduled in the next tick by the stream
constructor, delaying any _read()
and _destroy()
calls until callback
is
called. This is useful to initialize state or asynchronously initialize
resources before the stream can be used.
const { Readable } = require('node:stream');
const fs = require('node:fs');
class ReadStream extends Readable {
constructor(filename) {
super();
this.filename = filename;
this.fd = null;
}
_construct(callback) {
fs.open(this.filename, (err, fd) => {
if (err) {
callback(err);
} else {
this.fd = fd;
callback();
}
});
}
_read(n) {
const buf = Buffer.alloc(n);
fs.read(this.fd, buf, 0, n, null, (err, bytesRead) => {
if (err) {
this.destroy(err);
} else {
this.push(bytesRead > 0 ? buf.slice(0, bytesRead) : null);
}
});
}
_destroy(err, callback) {
if (this.fd) {
fs.close(this.fd, (er) => callback(er || err));
} else {
callback(err);
}
}
}