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 docs 说 writable.end()
接受回调
您也可以像这样承诺并等待回调:
const p = new Promise(res => this.write_stream.end(res))
await p;
尽管如此,我认为您不应该等待第一个流完成后再在对象上替换它。这可能会导致竞争条件,即某些东西试图写入已经结束但尚未完全完成的流。
换句话说,如果在调用 .end() 后尝试对流进行 .write() 操作,则会出错,因此您必须在调用 .end() 后立即替换流,以使其成为无缝。
我有一个 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 docs 说 writable.end()
接受回调
您也可以像这样承诺并等待回调:
const p = new Promise(res => this.write_stream.end(res))
await p;
尽管如此,我认为您不应该等待第一个流完成后再在对象上替换它。这可能会导致竞争条件,即某些东西试图写入已经结束但尚未完全完成的流。
换句话说,如果在调用 .end() 后尝试对流进行 .write() 操作,则会出错,因此您必须在调用 .end() 后立即替换流,以使其成为无缝。