使用 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 而不是使用普通回调。这允许您将 await
与 try/catch
或 .then()
和 .catch()
一起使用,而不是简单的回调来知道它何时完成,并且承诺通常更容易与其他异步序列一起使用操作和集中错误处理。
因为mkdir是async
.
示例:
如果你这样做:
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。
我正在使用 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 而不是使用普通回调。这允许您将 await
与 try/catch
或 .then()
和 .catch()
一起使用,而不是简单的回调来知道它何时完成,并且承诺通常更容易与其他异步序列一起使用操作和集中错误处理。
因为mkdir是async
.
示例:
如果你这样做:
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。