繁体   English   中英

异步功能-这是“回调地狱”吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM