1

我有这段代码:

const file = fs.createWriteStream('./test.txt');
let written = true;

// handler is added before even an attempt to write is made
file.on('drain', function () {
    written = true;
    console.log('drained');
});

const interval = setInterval(function () {
    if (Date.now() - time > 10000) {
        clearInterval(interval);
    }

    if (written) {
        written = file.write(new Array(1000000).join('z'));
    }
}, 100);

我想知道是否即使尝试写入也是添加处理程序的标准做法?

4

1 回答 1

1

如果使用file.on('drain')侦听器,您可以设置通用侦听器来排出流的事件。注意:这个监听器将在可写流关闭后被移除。

通常,该代码将正常工作,但 Node.js 中最常见的做法是stream.once('drain')对每种内部缓冲区超出情况使用处理程序。该方法包含在Event: 'drain'Node.js的文档中:

function writeOneMillionTimes(writer, data, encoding, callback) {
    var i = 1000000;
    write();
    function write() {
        var ok = true;

        do {
            i -= 1;
            if (i === 0) {
                // last time!
                writer.write(data, encoding, callback);
            } else {
                // see if we should continue, or wait
                // don't pass the callback, because we're not done yet.
                ok = writer.write(data, encoding);
            }
        } while (i > 0 && ok);

        if (i > 0) {
            // had to stop early!
            // write some more once it drains
            writer.once('drain', write);
        }
    }
}
于 2016-12-29T12:06:47.873 回答