使用 NodeJS FS mkdir 时,包含回调的重要性是什么?

When working with NodeJS FS mkdir, what is the importance of including callbacks?

我正在使用 NodeJS REPL 控制台并遵循本教程。

http://www.tutorialspoint.com/nodejs/nodejs_file_system.htm

我专注于 File System(FS) 模块。让我们看看用于创建目录的 mkdir 函数。

根据 TutorialsPoint,这就是使用 FS 创建目录的方法

var fs = require("fs");

console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err){
   if (err) {
       return console.error(err);
   }
   console.log("Directory created successfully!");
});

他们特别说你需要这个语法

fs.mkdir(path[, mode], callback)

好吧,我只是尝试在没有回调的情况下使用更少的代码,并且成功了。

var fs = require('fs');
fs.mkdir('new-directory');

目录已创建。语法应该只是

fs.mkdir(path);

我不得不问,回调的目的是什么,你真的需要它吗?对于删除目录,我可以理解你为什么需要它,以防目录不存在。但是我看不出 mkdir 命令可能出了什么问题。似乎有很多不必要的代码。

因为是异步调用,所以程序的进一步执行可能取决于操作的结果(dir创建成功)。回调执行的时间是第一个可以检查的时间点。

然而,这个操作真的很快,它可能看起来是瞬间发生的,但实际上(因为它是异步的),fs.mkdir(path); 之后的下一行将被执行,而不需要等待 [=] 的任何反馈10=] 因此 w/o 任何保证目录创建已经完成,或者如果它失败。

使用 mkdir 可能会导致很多事情出错,您可能应该处理异常和错误,并在可能的情况下 return 将它们返回给用户。

例如mkdir /foo/bar 可能会出错,因为您可能需要 root (sudo) 权限才能创建顶级文件夹。

但是,回调背后的一般思想是您使用的方法是异步的,并且考虑到 Javascript 的工作方式,您可能希望在目录创建后收到通知并继续执行程序.

更新:请记住,如果您需要——比方说——将文件保存在目录中,您将需要使用该回调:

fs.mkdir('/tmp/test', function (err) {
    if (err) {
        return console.log('failed to write directory', err);
    }

    // now, write a file in the directory
});

// at this point, the directory has not been created yet

我还建议您看一下 promises,它现在比回调更常用。

从节点 v10.0 开始,需要回调 fs.mkdir()。你必须传递它,即使你只是传递一个什么都不做的虚拟函数。

回调的目的是让您知道调用是否以及何时成功,如果没有成功,具体错误是什么。

记住,这种类型的函数是异步的。它在未来某个未知的时间完成,所以知道它何时完成或是否成功完成的唯一方法是传递回调函数,当调用回调函数时,您可以检查错误并查看它是否已完成。

事实证明,mkdir() 肯定会出现问题,例如路径错误、权限错误等...所以错误肯定会发生。而且,如果你想立即使用那个新目录,你必须等到回调被调用后再使用它。

针对您的其他评论之一,无论您是否传递回调,fs.mkdir() 函数始终是异步的。

这是一个例子:

var path = '/tmp/test';
fs.mkdir(path, function (err) {
    if (err) {
        console.log('failed to create directory', err);
    } else {
        fs.writeFile(path + "/mytemp", myData, function(err) {
            if (err) {
                console.log('error writing file', err);
            } else {
                console.log('writing file succeeded');
            }
        });
    }
});

注意: nodejs 的现代版本,包括 fs.promises.mkdir() 其中 returns 承诺 resolves/rejects 而不是使用普通回调。这允许您将 awaittry/catch.then().catch() 一起使用,而不是简单的回调来知道它何时完成,并且承诺通常更容易与其他异步序列一起使用操作和集中错误处理。

因为mkdirasync.

示例:

如果你这样做:

fs.mkdir('test');
fs.statSync('test').isDirectory();//might return false cause it might not be created yet

但如果你这样做:

fs.mkdir('test', function() {
    fs.statSync('test').isDirectory();//will be created at this point
});

如果您需要 sync 版本,您仍然可以使用 mkdirSync