在此代码中:
wStream = require("stream").Writable,
logStream = function logStream () {
this.file = logfile;
wStream.call(this);
};
require("util").inherits(logStream, wStream);
logStream.prototype._write = function logStream_write (data, enc, cb) {
fs.appendFile(this.file, data, 'utf-8', function WatchLogErr(err) {
if (err) {throw Error(err);}
});
//cb(data);
cb();
};
const log = new logStream();
我想知道如何使用 cb 以及从何处调用它? 我可以举一些例子来了解它是如何有用的。 试图把我的头包裹在stream.Writable api方法。
是否可以在此cb中传递参数?我必须添加什么额外的逻辑才能使用这个cb?
答案 0 :(得分:1)
当您调用cb()
时,它会告诉编写器您已成功处理数据并准备处理下一个块。然后,如果有任何数据,编写者将以_write
方法向您发送更多数据。
如果您没有拨打cb()
但有更多可用数据,则编写器会将所有传入数据放入内部缓冲区并等待您拨打cb()
。
在您的示例中,您在附加完成之前调用回调。即使在上一次附加完成之前,也有可能再次调用fs.appendFile
。这可能会给您带来不良后果。所以正确的方法是在fs.appendFile
回调中调用它:
logStream.prototype._write = function logStream_write (data, enc, cb) {
fs.appendFile(this.file, data, 'utf-8', function WatchLogErr(err) {
cb(err)
});
};
正如您所注意到的,cb
只接受一个作为错误对象的参数。在cb中传递错误对象将在编写器流上发出error
事件。