有关node.js

时间:2016-10-05 08:06:36

标签: javascript node.js npm fs

目的

要知道fs.writeFileSync()fs.writeFile()写完文件的时间,我可以执行另一个功能。

背景

我正在使用fs编写文件,为了知道文件写完的时间,我检查了它的文档:

阅读之后,我将注意力集中在fs.writeFile()fs.writeFileSync(),但我发现文档缺乏,我对此表示怀疑。

关于fs.writeFile()

的问题
  1. 在写入文件之前,或者在写入文件并将其保存在磁盘中之后,是否调用了回调函数?
  2. 关于fs.writeFileSync()

    的问题
    1. 如果总是返回undefined
    2. ,我怎么知道是否发生了错误
    3. 作为同步写入,是否意味着我的代码将被迫等待文件完全写入?
    4. 一般问题

      1. 如果我想同时编写两个不同的文件,并在两者完成时执行单个操作,我将如何使用fs.writeFile()执行此操作?
      2. NPM中是否有用户友好的图书馆来进行此类工作?我搜索过但没有找到任何令人信服的东西。
      3. 结论

        我总体上对fs感到困惑,而且我的知识不足以在我的代码中最大限度地使用它。为了改进,我需要查看更多代码示例,因此首选代码示例的答案。

        感谢您的时间!

5 个答案:

答案 0 :(得分:3)

首先,这是一个很重要的提示。如果文档没有解释某些内容,并且您无法通过简单的测试轻松回答问题,那么您可以随时查看GitHub上的源代码。例如,这里the source for fs.writeFileSync() on Github。这是开源项目的巨大优势之一。如有疑问,请查看代码。

有时,找到正确的源代码并不是那么容易(GitHub搜索在测试用例代码中的匹配数比在原始代码中多10倍)。在这些情况下,您只需在调试器中的自己的代码中设置断点,然后直接进入相关函数。调试器会将您带到源,您可以准确地看到它正在做什么。

现在提出你的问题......

  

有关fs.writeFile()的问题

     

在写入文件之前调用回调函数是否正确   写入或写入并保存在磁盘后?

在写入文件后(或遇到错误时)调用它。

  

有关fs.writeFileSync()的问题

     
      
  1. 如果始终返回undefined,我怎么知道是否发生错误?
  2.   

如果有错误,fs.writeFileSync会抛出异常。您必须使用try / catch来捕获任何异常。

  
      
  1. 作为同步写入,是否意味着我的代码将被强制执行   等到文件完全写好?
  2.   

是的,同步版本将阻塞,直到文件完全写入。您不会在正常的服务器开发中使用同步版本,因为它会占用主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,我怎么知道是否发生错误?

will throw an exception

作为同步写入,是否意味着我的代码将被迫等待文件完全写入?

是的!这是同步功能的重点。

如果我想同时编写两个不同的文件,并在两者完成时执行单个操作,我将如何使用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库,如上例所示。如果他们相互依赖,则可以使用asyncbluebird 链接或宣传