stream.Writable:如何在定义prototype._write方法时使用CallBack?

时间:2015-09-02 20:03:00

标签: node.js

在此代码中:

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?

1 个答案:

答案 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事件。