Javascript Node.js WriteStream同步

Javascript Node.js WriteStream同步,javascript,node.js,Javascript,Node.js,我正在node.js中编写一个纯同步的单线程命令行程序,它需要编写一个二进制文件,为此我使用WriteStream。我的使用模式大致如下: var stream = fs.createWriteStream(file) stream.write(buf1) stream.write(buf2) 这似乎是可行的,但文档中说它是异步的,我想确保我没有编写99%时间都能正常工作的代码。我不在乎数据何时被写入,只要它是按照指定的顺序写入的,并且不迟于程序退出时,而且数据量很小,所以速度和内存消耗不是问

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

var stream = fs.createWriteStream(file)
stream.write(buf1)
stream.write(buf2)
这似乎是可行的,但文档中说它是异步的,我想确保我没有编写99%时间都能正常工作的代码。我不在乎数据何时被写入,只要它是按照指定的顺序写入的,并且不迟于程序退出时,而且数据量很小,所以速度和内存消耗不是问题

我已经看到有人提到了
stream.end()
,但是没有它似乎可以工作,而且我还看到一些建议,如果不使用回调函数,调用它实际上可能是一个坏主意,因为它可能会在写入所有数据之前被调用


我的方法正确吗(假设我希望完全同步),或者有什么需要注意的吗?

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

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

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

根据

我不完全确定这是否适合您的用例(并且认识到它可能不是您想要的),但是您是否考虑过将fs.write作为同步选项@问得好!同步版本似乎可以完成这项工作。这两者有什么区别?或者换一种方式,考虑到它的存在,WriteStream存在的原因是什么?WriteStream主要用于写文本吗?老实说,我对流没有最好的理解,但每当我需要一种同步方法来写东西的时候。这里有一个比我能给出的更好的解释:Node非常以异步IO为中心。为什么你如此专注于使所有逻辑同步?@loganfsmyth因为我正在编写一个简单的命令行程序,它本质上与异步IO无关。你不必使用
fs.SyncWriteStream
。只需执行一个
fd=openSync
,然后使用该
fd
执行一个
readSync
。API是什么?如何调用此函数。举个例子会很有帮助!警告,fs.syncWriteStream现已弃用:
fs.syncWriteStream
已弃用,在新的Node.js版本中不再可用。将
fs.OpenSync
与发生
end
事件时调用的
fs.WriteSync
finish
事件一起使用。但是在这种情况下,不知道什么时候才能完成编写,所以
finish
在这种情况下不起作用。