可以多个fs.write追加到同一个文件保证执行的顺序?

假设我们有这样一个程序:

// imagine the string1 to string1000 are very long strings, which will take a while to be written to file system var arr = ["string1",...,"string1000"]; for (let i = 1; i < 1000; i++) { fs.write("./same/path/file.txt", arr[i], {flag: "a"}}); } 

我的问题是, will string1 to string1000 be gurantted to append to the same file in order?

由于fs.write是asynchronous函数,我不确定每次调用fs.write()是如何执行的。 我假设对每个string的函数调用应该放在another thread某个地方(如一个callstack ?),一旦前一个调用完成,下一个调用可以执行。

我不确定我的理解是否准确。

编辑1

正如在注释和答案中,我看到fs.write是不安全的多写入同一个文件,而不用等待callback 。 但是writestream呢?

如果我使用下面的代码,它会保证写作的顺序吗?

 // imagine the string1 to string1000 are very long strings, which will take a while to be written to file system var arr = ["string1",...,"string1000"]; var fileStream = fs.createWriteFileStream("./same/path/file.txt", { "flags": "a+" }); for (let i = 1; i < 1000; i++) { fileStream.write(arr[i]); } fileStream.on("error", () => {// do something}); fileStream.on("finish", () => {// do something}); fileStream.end(); 

任何意见或更正将有所帮助! 谢谢!

文件说这个

请注意,在不等待callback的情况下,在同一个文件上多次使用fs.write是不安全的。 对于这种情况,强烈build议使用fs.createWriteStream。

使用stream是有效的,因为stream固有地保证写入它们的string的顺序与从它们中读出的顺序相同。

 var stream = fs.createWriteStream("./same/path/file.txt"); stream.on('error', console.error); arr.forEach((str) => { stream.write(str + '\n'); }); stream.end(); 

另一种仍然使用fs.write方法,但也要确保事情的顺序是使用promise来维护时序逻辑。

 function writeToFilePromise(str) { return new Promise((resolve, reject) => { fs.write("./same/path/file.txt", str, {flag: "a"}}, (err) => { if (err) return reject(err); resolve(); }); }); } // for every string, // write it to the file, // then write the next one once that one is finished and so on arr.reduce((chain, str) => { return chain .then(() => writeToFilePromise(str)); }, Promise.resolve()); 

您可以使用节点的读取/写入locking来同步对文件的访问,请参阅以下示例,您可以阅读文档

 var ReadWriteLock = require('rwlock'); var lock = new ReadWriteLock(); lock.writeLock(function (release) { fs.appendFile(fileName, addToFile, function(err, data) { if(err) console.log("write error); else console.log("write ok"); release(); // unlock }); });