要知道fs.writeFileSync()
或fs.writeFile()
写完文件的时间,我可以执行另一个功能。
我正在使用fs
编写文件,为了知道文件写完的时间,我检查了它的文档:
阅读之后,我将注意力集中在fs.writeFile()
和fs.writeFileSync()
,但我发现文档缺乏,我对此表示怀疑。
fs.writeFile()
fs.writeFileSync()
undefined
?fs.writeFile()
执行此操作? 我总体上对fs
感到困惑,而且我的知识不足以在我的代码中最大限度地使用它。为了改进,我需要查看更多代码示例,因此首选代码示例的答案。
感谢您的时间!
答案 0 :(得分:3)
首先,这是一个很重要的提示。如果文档没有解释某些内容,并且您无法通过简单的测试轻松回答问题,那么您可以随时查看GitHub上的源代码。例如,这里the source for fs.writeFileSync() on Github。这是开源项目的巨大优势之一。如有疑问,请查看代码。
有时,找到正确的源代码并不是那么容易(GitHub搜索在测试用例代码中的匹配数比在原始代码中多10倍)。在这些情况下,您只需在调试器中的自己的代码中设置断点,然后直接进入相关函数。调试器会将您带到源,您可以准确地看到它正在做什么。
现在提出你的问题......
有关fs.writeFile()的问题
在写入文件之前调用回调函数是否正确 写入或写入并保存在磁盘后?
在写入文件后(或遇到错误时)调用它。
有关fs.writeFileSync()的问题
- 如果始终返回undefined,我怎么知道是否发生错误?
醇>
如果有错误,fs.writeFileSync会抛出异常。您必须使用try / catch来捕获任何异常。
- 作为同步写入,是否意味着我的代码将被强制执行 等到文件完全写好?
醇>
是的,同步版本将阻塞,直到文件完全写入。您不会在正常的服务器开发中使用同步版本,因为它会占用主node.js线程。
一般问题
如果我想同时写两个不同的文件,那么 当两者都完成时执行单个动作,我该怎么做 使用fs.writeFile()?
目前这类问题的典型设计模式是使用promises和Promise.all()
来跟踪多个异步操作的完成情况。
使用Bluebird promise库:
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模块中包含每个异步操作,其中一个函数返回一个promise,其名称包含带有Async
后缀的版本,因此fs.writeFile()
获取{fs.writeFileAsync()
Promise.all()
1}}返回一个promise而不是直接回调。然后,您可以使用Promise控制流(例如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
});
)来管理或协调多个异步操作。
你不必使用Bluebird库,因为Promises现在内置于node.js(以及ES6规范的一部分),但是node.js并不是那么简单。将现有的异步回调函数转换为承诺返回函数和Bluebird。如果你愿意的话,你可以自己做宣传。
override func awakeFromNib()
{
super.awakeFromNib()
// Initialization code
self.collectionView2?.delegate = self
self.collectionView2?.dataSource = self
}
答案 1 :(得分:1)
这么多问题......让我们走吧:
(fs.writeFile()
...)在写入文件之前,或者在写入文件并将其保存在磁盘中之后,是否调用了回调函数?
操作完成后,是否成功。
(fs.writeFileSync()
...)如果始终返回undefined
,我怎么知道是否发生错误?
作为同步写入,是否意味着我的代码将被迫等待文件完全写入?
是的!这是同步功能的重点。
如果我想同时编写两个不同的文件,并在两者完成时执行单个操作,我将如何使用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中是否有用户友好的图书馆来进行此类工作?我搜查了但是我找不到任何令人信服的东西。
不完全(我知道...),但 应该使用promises和 promisified fs
调用。然后你就可以使用Promise.all
了,它看起来都会更好!
答案 2 :(得分:1)
在写入文件之前,或者在写入文件并将其保存在磁盘中之后,是否调用了
fs.writeFile()
回调函数?
当文件写入磁盘时调用该函数。
如果
fs.writeFileSync()
总是返回undefined
,我怎么知道是否发生了错误?
> fs.writeFileSync('/test', 'foo')
Error: EACCES: permission denied, open '/test'
at Error (native)
...
throw
您可以try..catch
发生错误。
fs.writeFileSync()
是同步写入,这是否意味着我的代码将被迫等待文件完全写入?
是;与所有同步函数一样,代码将一直阻塞,直到函数返回。
如果我想同时写两个不同的文件,并在两者完成时执行单个操作,我将如何使用
fs.writeFile()
进行操作?
使用promises:
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');
});
答案 3 :(得分:0)
fs.writeFile()是异步的。这意味着在写入文件后发生回调。 fs.writeFileSync()不是,这意味着它是非阻塞的,并且将执行其他进行中的代码。要写入两个单独的文件, 并且在完成后执行某些操作,您只需嵌套aysnc回调,如
fs.writeFile('test.txt', 'text', function(){
fs.writeFile('test2.txt', 'text', function(){
console.log('done');
});
});
要知道同步功能有错误,您可以使用例外。
答案 4 :(得分:0)
以下是您要找的内容:
Q1)在写入文件之前,或者在写入文件并将其保存在磁盘中之后,是否调用了回调函数?
Ans1)回调函数在尝试写入文件操作后返回错误或成功。尝试失败或写入成功。所以它会返回错误,回调成功。最后,在&#34之后调用回调;尝试写文件操作"。
Q2)如果始终返回undefined,我怎么知道是否发生了错误?
Ans2)你可以使用try和catch,因为如果它成功写入则返回没有响应但是如果它没有这样做。你会得到一个例外。
Q3)作为同步写入,是否意味着我的代码将被迫等待文件完全写入?
Ans3)是的,在本质上是同步的,不要让其他语句/操作执行,直到写完整个文件写入任务。
Q4)如果我想同时写两个不同的文件,并在两者完成时执行单个操作,我将如何使用fs.writeFile()?
Ans4)因此,在这种情况下,您可以使用回调或承诺。简单来说,如果它们相互依赖,您可以将任务一个接一个地链接到。但如果它们彼此独立,那么只需编写两段代码即可。它很容易写。下面给出的代码是两个独立的任务。
fs.writeFile('file.txt', 'hello', function(error){ //do something }); fs.writeFile('file1.txt', 'Amulya', function(error){ //do something});
他们都会在同一时间执行,因为异性,他们会毫不费力地完成。
Q5)NPM中是否有用户友好的库来完成这类工作?我搜查了但是我找不到任何令人信服的东西。
Ans5)如果bopth任务彼此独立,则不需要NPM库,如上例所示。如果他们相互依赖,则可以使用async
或bluebird
链接或宣传。