javascript - Stream.end() 是同步的吗?

标签 javascript node.js io fs

我有一个类,它维护一个名为write_stream的实例变量。这个 write_stream 变量会使用新的写入流进行更新,目前我会执行以下操作:

const fs = require('fs');

class Test {

   constructor() {
      this.write_stream = null;
   }

   ...

   set_write_stream(new_file_path) {
      if (this.write_stream != null) {
         this.write_stream.end();
      }
      this.write_stream = fs.createWriteStream(new_file_path);
   }
}

这是一种可以接受的方法吗?有更好的方法吗? stream.end() 是同步的,还是需要等待某种 promise 才能继续 fs.createWriteStream()

最佳答案

nodejs docswritable.end() 接受回调

您还可以像这样 promise 并等待回调:

const p = new Promise(res => this.write_stream.end(res))
await p;

尽管如此,我认为您不应该等待第一个流完成后再将其替换到对象上。这可能会导致竞争条件,即某些东西试图写入已经结束但未完全完成的流。

换句话说,如果在您调用 .end() 之后尝试对流进行 .write() 操作,则会出错,因此您必须在调用 .end() 之后立即替换该流,以使其无缝。

关于javascript - Stream.end() 是同步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61110941/

相关文章:

performance - Hadoop MapReduce 为多个作业读取一次数据集

javascript - 如何删除括号并计算它们?

node.js - 在 react native 中播放来自 Node 流的音频

javascript - 为什么 json-parser 解析错误我的 json

javascript - __dirname 未在 Node 14 版本中定义

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

javascript - casperjs 无法识别存储在 then 语句之间的全局变量

javascript - 如何解析嵌入式 iFrame 以仅显示来自 iframed 页面的片段?

Javascript列表像数据结构?

perl - 在 perl 中打开文件时,如果文件名为 "-",如何自动使用 STDIN/OUT?