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

How to wait before file stream is done writing before I close it?

我创建一个文件流来写入一个 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();

突然间,文件就完成了。但是超时是一种愚蠢的解决方案。 filestream 完成写入后是否发出任何事件。基本上我需要的是:

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

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

fs.createWriteStream() returns a WriteStream object which is a WritableStream, this means that when you call .write() you're calling 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 如今实际上已成为标准,始终留意回调函数,它允许您在异步块完成后 运行 代码。