【问题标题】:How to wait before file stream is done writing before I close it?如何在文件流完成写入之前等待我关闭它?
【发布时间】:2017-06-02 21:25:16
【问题描述】:

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

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

【问题讨论】:

  • 你试过logger.on("end", ...),还是logger.on("close", ...)

标签: javascript node.js bluebird fs


【解决方案1】:

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 实际上已成为一种标准,请始终注意回调函数,它允许您在异步块完成后运行代码。

【讨论】:

  • 我可以写空字符串并且仍然得到回调吗?因为,在代码的最后,我没有写任何东西(它发生在 while 循环中),但我仍然需要等到最后发生的写入完成。
  • 我不明白为什么回调会失败,因为从技术上讲,您仍然会写入文件......只是没有任何内容。您可以随时尝试看看会发生什么,我很想知道!
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2013-03-22
  • 2017-07-30
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多