什么是`fs.appendFile()`的primefaces性保证?

fs.appendFile()的文档在primefaces性保证方面含糊不清。

我特别想知道,如果在同一个文件上进行两次或多次调用,而不是等待中间的callback,数据是否可能交错或丢失(例如,由于写入重叠区域)。 例如,拿这个代码:

 fs.writeFileSync('blort.bin', ''); for (let i = 0; i < 10; i++) { const data = Buffer.alloc(65536, i); fs.appendFile('blort.bin', data, () => {}); } 

假设没有文件系统错误,并且没有其他进程正在写入有问题的文件,那么在完成所有附加操作之后,Node是否会做出以下保证?

  • 该文件的大小正好是640k。
  • 该文件由10个64k数据块组成,每个数据块均包含一个字节值。

我也很好奇,如果有任何序列化保证(虽然我不假设)。 也就是说,附件是否保证按顺序执行?

更新:增加了澄清,这是唯一的代码在文件上的代码。

就我所知,您的附加将按顺序发生,除非另一个进程正在写入目标文件,否则不会覆盖现有数据。

节点是单线程的(从正在运行的应用程序的angular度来看),并在内部对文件写入进行排队,因此如果将1 23写入文件,则文件将包含123

节点不会启动新的线程来处理IO,但这是运行时的一个特性,对开发人员来说是隐藏的。

UPDATE

在第一次阅读时,我错过了您的要求,即您的追加发生在callback空白或不起作用的多个呼叫中。

这极大地改变了事情。

如果使用asynchronous调用,如fs.appendFile() ,则必须提供必须检查错误的callback。 如果您在不等待callback结束的情况下堆叠asynchronous调用, 则不能保证您的写入将按顺序进行,也不会覆盖以前的数据。

底线: 不要使用asynchronous函数没有适当的callback,总是检查错误。

否则打破了Node的事件驱动模型的整个想法。

我通常解释的方式是考虑到,在asynchronous调用中, 无法预测callback将由于多种因素(包括CPU和IO负载)而被触发

如果您不知道何时触发callback,则无法预测多个呼叫将按顺序运行。

更新2

要清楚的是,你不能在不提供callback的情况下调用asynchronous函数,并保证任何预期的行为。

从事件angular度考虑:

fs.appendFile()向IO线程添加事件处理程序,并将包含其参数的事件发送到IO线程。

一旦操作完成,这个事件处理程序被触发,这是你的callback或将触发你的callback。

无需等待手术完成,就不能保证手术成功或完成了您的预期。