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

标签 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();

但是当我这样做时,文件末尾的部分内容丢失了。我尝试在关闭流之前 sleep :

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

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

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

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

最佳答案

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 实际上已经成为当今的标准,始终留意回调函数,它允许您在异步 block 完成后运行代码。

关于javascript - 在关闭文件流之前如何等待文件流完成写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44329870/

相关文章:

javascript - 无法获取全局变量

node.js - Gulp安装警告: "Please update to minimatch 3.0.2"

node.js - Node https ssl 你的连接不是私有(private)错误

node.js - 如何使用 UUID 和 Postgres pg-promise 库创建 ExpressJS Restful API

javascript - Bluebird.JS Promise : new Promise(function (resolve, reject){}) vs Promise.try(function(){})

javascript - 如何在解决所有 javascript ES6 Promises 后运行

node.js - Babel 将异步到模块方法转换为带有 ES6 映射的 Bluebird

javascript - 模仿div中的textarea

javascript - 相同高度盒子的优雅解决方案

javascript - 将正则表达式组解构为对象而不是数组