Является ли stream.end () синхронным? - PullRequest
1 голос
/ 09 апреля 2020

У меня есть класс, который поддерживает переменную экземпляра с именем 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()?

1 Ответ

2 голосов
/ 09 апреля 2020

nodejs документы говорят, что writable.end() принимает обратный вызов

Вы также можете обещать и ждать обратного вызова следующим образом:

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

Хотя, Я не думаю, что вам следует ждать окончания первого потока до sh, прежде чем заменять его на объекте. Это может привести к состоянию гонки, при котором что-то пытается записать в уже завершенный, но не полностью завершенный поток.

Другими словами, если что-то пытается сделать .write () поток после того, как вы вызовете .end (), это приведет к ошибке, поэтому вы должны заменить поток сразу после вызова .end (), чтобы это быть бесшовным.

...