Node.js写流同步

Node.js WriteStream synchronous

本文关键字:同步 js Node      更新时间:2023-09-26

我在node.js中编写一个纯同步的单线程命令行程序,它需要编写一个二进制文件,为此我使用WriteStream。我的使用模式如下:

var stream = fs.createWriteStream(file)
stream.write(buf1)
stream.write(buf2)

这似乎可以工作,但文档说它是异步的,我想确保我写的代码不是99%的时间工作。我不关心数据写入的确切时间,只要它按照指定的顺序写入,并且不迟于程序退出,并且数据量很小,因此速度和内存消耗不是问题。

我已经看到提到stream.end(),但它似乎没有它工作,我也看到的建议,调用它可能实际上是一个坏主意,如果你不使用回调,因为它可能最终被调用之前,所有的数据写入。

我的方法是正确的(假设我想要纯同步)还是有什么我需要注意的?

您可以这样做,唯一的问题是如果您为同一路径创建两个或多个并发流:来自不同流的写顺序将未定义。顺便说一下,在节点:fs.SyncWriteStream中有一个同步的fs写流实现。它是私有的,需要fd作为一个参数,但是如果你真的想要它…

我正在研究一个时间关键的API,在执行下一个操作之前,必须编写新文件并完全处理其流。解决方案,在我的情况下(很可能,OP的问题)是使用:

writer.on('finish', () => {
 console.error('All writes are now complete.');
});

按照fs Event: 'finish'文档

const writeToLocalDisk = (stream, path) => {
  return new Promise((resolve, reject) => {
    const istream = stream;
    const ostream = fs.createWriteStream(path);
    istream.pipe(ostream);
    istream.on("end", () => {
      console.log(`Fetched ${path} from elsewhere`);
      resolve();
    });
    istream.on("error", (err) => {
      console.log(JSON.stringify(err, null, 2));
      resolve();
    });
  });
};
// Then use an async function to perform sequential-like operation
async function sequential (stream) {
  const path = "";
  await writeToLocalDisk(stream, path);
  console.log('other operation here');
}