stream.end() 是同步的吗?

Is stream.end() synchronous?

我有一个 class,它维护一个名为 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() 是同步的,还是我需要等待某种承诺才能继续 fs.createWriteStream()

nodejs docswritable.end() 接受回调

您也可以像这样承诺并等待回调:

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

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

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