[英]Asynchronous Functions - Is this 'callback hell'?
我对节点的了解越来越多,最大的问题是弄清异步函数是如何工作的。
fs.readdir(base, function (err, files) {
if (!files.length) {
console.log('No files');
}
for (var i in files) {
fs.stat(files[i], function (err, stats) {
if (stats.isDirectory()) {
console.log(files[i]);
console.log('FOLDER');
} else {
console.log(files[i]);
console.log('FILE')
}
})
}
});
base
是一个文件夹,其中包含两个子文件夹,以及一个.DS_Store文件。 命令行的输出将是:
.DS_Store
FILE
/dir/to/file/index.js:115
if (stats.isDirectory()) {
^
TypeError: Cannot read property 'isDirectory' of undefined
我现在的基本理解是存在此问题,因为它都是异步发生的-我最好的猜测是readdir
回调不“等待” fs.stat
回调完成? 我可能完全误会了它(实际上,从中获得基本了解的任何好的文档都将有所帮助)。
我的下一个想法是像诺言? 他们似乎解决了异步问题,因此这将是我学习的下一个飞跃。
这是“回调地狱”吗? 承诺是否解决? 有其他方法可以做到这一点吗?
根据您其余的代码,这里可能存在一些问题。 一个是fs.stat将路径作为第一个参数而不是文件名。 如果您将函数调用更改为fs.stat(base + '/' + files[i], function (err, stats)
可能会有所帮助,但我不确定您的示例中的base
是什么。
其次,您应该在循环中使用ES6 let
而不是var
。 异步函数将放置在调用堆栈上,并在完成后按顺序进行处理。 但是,到那时,循环将一直贯穿整个过程,并且变量i
将等于上一次迭代中的值。 另一方面,用let
定义的变量在范围上仅限于一个块,这意味着每个函数由于位于单独的块中,因此具有正确的i
值。
尝试测试如下所示的两个不同版本,首先使用for (var i in files)
,然后使用for (let i in files)
,您将明白我的意思。
for (var i in files) {
fs.stat(files[i], function (err, stats) {
if (stats.isDirectory()) {
console.log(files[i]);
console.log('FOLDER');
console.log(i);
} else {
console.log(files[i]);
console.log('FILE')
console.log(i);
}
})
}
另外,如对您的问题的评论中所建议,我建议您进行适当的错误处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.