据我所知,您的追加将按顺序进行,除非另一个进程正在写入目标文件,否则不会覆盖现有数据。
节点是单线程的(从正在运行的应用程序的角度来看)并在内部对文件写入进行排队,因此如果您编写1
2
and 3
到一个文件,该文件将包含123
.
Node 确实会启动新线程来处理 IO,但这是运行时的一个功能,对开发人员是隐藏的。
UPDATE
在第一次阅读时,我错过了您的要求,即您的附加发生在回调为空白或不起作用的多个调用中。
这极大地改变了事情。
如果您使用异步调用,例如fs.appendFile()
,您必须提供一个必须检查错误的回调。如果您堆叠异步调用而不等待它们的回调结束,无法保证您的写入会按顺序发生或不会覆盖以前的数据。
底线:如果没有始终检查错误的适当回调,请勿使用异步函数。
否则就会破坏 Node 事件驱动模型的整个理念。
我通常解释这一点的方式是考虑到,在异步调用中,你无法预测回调何时被触发由于许多因素,包括 cpu 和 IO 负载。
如果您无法知道何时触发回调,则无法预测多个调用将按顺序运行。
UPDATE 2
需要明确的是,您无法在不提供回调的情况下调用异步函数并保证any预期的行为。
从事件的角度来思考:
fs.appendFile()
将事件处理程序添加到 IO 线程,并将包含其参数的事件发送到 IO 线程。
操作完成后,将触发此事件处理程序,这要么是您的回调,要么将触发您的回调。
如果不等待操作完成,您就无法保证操作已成功或已完成您所期望的操作。