在关闭之前如何在文件流完成之前等待?

时间:2017-06-02 13:12:53

标签: javascript node.js bluebird fs

我创建了一个文件流来编写csv文件:

    var logger = fs.createWriteStream('restaurants.csv', {
      flags: 'w' // 'a' means appending (old data will be preserved)
    });
    logger.write("sep=,\n");

当我完成写作时,我会像这样关闭流:

    logger.end();
    logger.close();

但是当我这样做时,最后会遗漏部分文件。在关闭流之前我试着睡觉:

    await Promise.delay(2000);
    logger.end();
    logger.close();

突然,文件已经完成了。但是超时是一种愚蠢的解决方案。文件流在写完后会发出任何事件。基本上我需要的是:

    await logger.doneWriting();
    logger.end();
    logger.close();

我当然可以宣传任何事件,但它是哪个事件?

1 个答案:

答案 0 :(得分:2)

fs.createWriteStream()会返回一个WriteStream对象WritableStream,这意味着当您致电.write()时,您正在呼叫writable.write()实际需要回电作为参数,您可以在完成后立即关闭流!

var logger = fs.createWriteStream('restaurants.csv', {
  flags: 'w' // 'a' means appending (old data will be preserved)
});
logger.write("sep=,\n", () => {
    // Done writing... do what's needed then close the stream if it isn't used anymore
});

异步JavaScript现在几乎已经成为标准,总是在寻找回调函数,它允许你在async块完成后运行代码。

相关问题