当使用NodeJS FS mkdir时,包含回调的重要性是什么?
When working with NodeJS FS mkdir, what is the importance of including callbacks?
我正在使用NodeJS REPL
控制台并遵循本教程。
我专注于File System(FS)
模块。让我们看看用于创建目录的mkdir
函数。
根据tutorialpoint,这是如何创建一个目录与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
命令有什么问题。似乎有很多不必要的代码。
从节点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()
,它返回一个承诺来解析/拒绝,而不是使用普通的回调。这允许您将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
使用mkdir
可能会出很多问题,您应该处理异常和错误,并在可能的情况下将它们返回给用户。
。mkdir /foo/bar
可能会出错,因为您可能需要root
(sudo)权限才能创建顶级文件夹。
然而,回调背后的一般思想是你使用的方法是异步的,并且考虑到Javascript的工作方式,你可能希望在目录创建后得到通知并继续你的程序执行。
Update:请记住,如果你需要——比方说——在目录中保存一个文件,你需要使用回调:
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
我还建议你看一下承诺,它现在比回调更常用。
因为这是一个异步调用,所以程序的进一步执行可能取决于操作的结果(dir是否成功创建)。当回调执行的时候是第一个可以检查的时间点。
然而,这个操作非常快,看起来好像是立即发生的,但实际上(因为它是异步的),fs.mkdir(path);
之后的以下行将在不等待fs.mkdir(path);
的任何反馈的情况下执行,因此没有任何保证目录创建已经完成,或者如果它失败了。
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- JQuery 承诺已经包含回调的函数
- YepNope/Modernizr 回调,包含全局 JavaScript 变量和 Internet Explorer
- $.post到PHP文件-在包含循环完成之前不会调用回调
- 从事件回调中引用包含主干视图
- Meteor.js HTTP.get 获取 JSON 引号并解析结果似乎包含一个回调函数
- 只包含回调的脚本需要JS填充程序
- JavaScript - 使用包含异步回调但仍返回原始值的函数覆盖函数
- AngularJS-在回调中包含变量
- 使用在包含的库中定义的JS函数,我成功了.错误回调不会触发.问题与我的JS或他们的
- Javascript和Ajax -在间隔中包含回调变量
- 如何使用Gulp的YouTube API(缩小的文件不包含YouTube回调方法)
- Javascript回调,如何包含额外的参数
- 如何承诺一个不包含回调参数的函数
- 带有包含请求的循环的回调数组
- Javascript包含函数与回调时加载
- 回调在所有函数的末尾包含在一个函数中
- 传递一个包含参数的回调函数
- 当使用NodeJS FS mkdir时,包含回调的重要性是什么?