关于node.js中fs的问题
目的
要知道什么时候fs.writeFileSync()
或fs.writeFile()
完成写入文件,所以我可以执行另一个函数。
背景
我正在使用fs
编写一个文件,为了知道文件写完的时间,我检查了它的文档:
- https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback
读完之后,我将注意力集中在fs.writeFile()
和fs.writeFileSync()
但是我发现缺less文档,我怀疑。
关于fs.writeFile()
- 在写入文件之前调用callback函数,因为正在写入文件或写入并保存在磁盘中之后?
关于fs.writeFileSync()
- 如何知道是否发生错误,如果它总是返回
undefined
? - 作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?
一般的问题
- 如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用
fs.writeFile()
来执行操作? - NPM中有用户友好的图书馆是否有这样的工作? 我搜查,但我没有发现任何令人信服的。
结论
我总是与fs
混淆,我的知识不足以最大限度地使用我的代码。 为了改进,我需要看到更多的代码示例,因此,代码示例的答案将是首选。
感谢您的时间 !
首先,这里有一个重要的提示。 如果文档没有解释某些东西,并且您不能用一个简单的testing来轻松回答这个问题,那么您可以随时查看GitHub上的源代码。 例如, 以下是Github上fs.writeFileSync()的源代码 。 这是开源项目的巨大优势之一。 如果有疑问,只要看看代码。
有时,find正确的源代码并不那么容易(GitHubsearch往往会在testing用例代码中find比原始源代码多10倍的search结果)。 在这种情况下,您可以在debugging器中的代码中设置一个断点,然后直接进入相应的函数。 debugging器会把你的权利,你可以看到它到底在做什么。
现在你的问题…
关于fs.writeFile()的问题
在写入文件之前调用callback函数,因为正在写入文件或写入并保存在磁盘中之后?
在写入文件(或遇到错误)后调用它。
关于fs.writeFileSync()的问题
- 如何知道是否发生错误,如果它总是返回undefined?
如果有错误,fs.writeFileSync将抛出exception。 您必须使用try / catch来捕获任何exception。
- 作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?
是的,同步版本将会阻塞,直到文件被完全写入。 你不会在正常的服务器开发中使用同步版本,因为它会占用主要的node.js线程。
一般的问题
如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行操作?
目前这种types的问题的典型devise模式是使用promise和Promise.all()
来跟踪多个asynchronous操作的完成。
使用蓝鸟承诺库:
const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs')); Promise.all([fs.writeFileAsync(fname1, data1), fs.writeFileAsync(fname2, data2)]).then(function() { // both async operations are done here }).catch(function(err) { // handle error here });
Bluebird的.promisifyAll()
方法将fs模块中的每个asynchronous操作封装为一个返回promise的函数,并用Async
后缀命名包装的版本,所以fs.writeFile()
获取fs.writeFileAsync()
,返回promise而不是直接回电话。 然后,您可以使用Promise控制stream(例如Promise.all()
来pipe理或协调多个asynchronous操作。
您不必为此使用Bluebird库,因为Promise现在已经构build到node.js中(而且是ES6规范的一部分),但是node.js没有那么容易的将现有的asynchronouscallback函数转化为promise返回函数和蓝鸟呢。 如果你愿意的话,你可以自己做这个promisification。
const fs = require('fs'); fs.writeFileAsync = function(fname, data) { return new Promise(function(resolve, reject) { fs.writeFile(fname, data, function(err) { if (err) return reject(err); resolve(); }); }); } Promise.all([fs.writeFileAsync(fname1, data1), fs.writeFileAsync(fname2, data2)]).then(function() { // both async operations are done here }).catch(function(err) { // handle error here });
这么多的问题让我们走吧:
( fs.writeFile()
…)在写入文件之前调用callback函数,因为正在写入文件或写入并保存在磁盘中之后?
手术完成后,无论成功与否。
( fs.writeFileSync()
…)如何知道如果总是返回undefined
的错误?
它会抛出一个exception 。
作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?
是! 这是一个同步function的重点。
如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()
来执行操作?
这里有一个方法:
const fs = require('fs'); let completions = 0; function onComplete(err) { if(err) { console.log('An error occurred', err); } completions++; if(completions === 2) { console.log('All done!'); } } fs.writeFile('file1.txt', 'Hello', onComplete); fs.writeFile('file2.txt', 'World', onComplete);
NPM中有用户友好的图书馆是否有这样的工作? 我搜查,但我没有发现任何令人信服的。
不完全(我知道…),但你应该看看使用承诺和promisified fs
电话。 那么你将可以使用Promise.all
,它会看起来更好!
在写入文件之前调用
fs.writeFile()
callback函数,因为正在写入文件或写入文件并保存在磁盘中之后?
当文件写入磁盘时调用该函数。
如何知道
fs.writeFileSync()
是否总是返回undefined
发生错误?
> fs.writeFileSync('/test', 'foo') Error: EACCES: permission denied, open '/test' at Error (native) ...
它会throw
一个错误,你可以try..catch
。
fs.writeFileSync()
是一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?
是; 与所有同步函数一样,您的代码将会阻塞,直到函数返回。
如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用
fs.writeFile()
来执行操作?
使用承诺 :
let write1 = new Promise((resolve, reject) => { fs.writeFile(file1, data1, err => { if (err) { reject(err); } else { resolve(); } }); }); let write2 = new Promise(/* same thing here */); Promise.all([write1, write2]).then(() => { console.log('both writes done'); });
fs.writeFile()是asynchronous的。 这意味着在写入文件之后发生callback。 fs.writeFileSync()不是,这意味着它是非阻塞的,其他的继续代码将被执行。 要写入两个单独的文件,并且一旦完成后就可以做一些事情,你可以简单地嵌套aysnccallback
fs.writeFile('test.txt', 'text', function(){ fs.writeFile('test2.txt', 'text', function(){ console.log('done'); }); });
要知道同步function有错误,您可以使用exception。
这就是你要找的东西:
Q1)在写入文件之前调用callback函数,因为正在写入文件或写入文件并保存在磁盘中之后?
Ans1)callback函数在写入文件操作尝试后返回错误或成功。 试图失败或写入成功。 所以它会返回错误,成功callback。 所以最后,在“写入文件操作尝试”之后调用callback函数。
Q2)如何知道错误是否总是返回undefined?
Ans2)你可以使用try和catch,因为如果写入成功,则返回没有响应,但是如果失败的话。 你会得到一个例外。
Q3)作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?
Ans3)是的,在写完整个文件写入任务之前,不要让其他的语句/操作执行。
Q4)如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行?
Ans4)因此,在这种情况下,您可以使用callback或承诺。 简而言之, 如果他们彼此依赖,你可以一个接一个地链接任务。 但是如果它们彼此独立,只需简单的写两块代码即可。 它会很容易写。 下面给出的代码是两个独立的任务。
fs.writeFile('file.txt', 'hello', function(error){ //do something }); fs.writeFile('file1.txt', 'Amulya', function(error){ //do something});
他们都会在同一时间执行,因为asynchronous的性质,他们将完成没有任何麻烦。
Q5)NPM是否有用户友好的图书馆进行这种工作? 我搜查,但我没有发现任何令人信服的。
Ans5)如上例所示,如果bopth任务是相互独立的,则不需要NPM库。 如果他们相互依赖的手段,那么你可以使用async
或bluebird
链或promisify它们。