递归遍历文件夹,想在递归全部结束得到的值val,以后再执行下一个方法。要怎么解决?
发布于 5 年前 作者 Chenyating 4489 次浏览 来自 问答

变量:

// 博客路径是js的相对的父级的父级
var articleRoad = path.resolve(__dirname, '../../Blogs')

// 将文档收入于articlelist
var articleList = [];
var isMd = RegExp(/.md/);//需要.md文件
var ignore = RegExp(/.git/);//忽略.git文件

递归函数:

// 获得博客类型的文章,上一级路径,文件名,类型
function getFileList(oldLoad, fileName, type) {
    var fileroad = path.join(oldLoad, fileName);// 博客类别路径
    var stat = fs.lstatSync(fileroad);//  判断是否为文件
    if (stat.isDirectory()) {//  判断是否为文件
        // console.log(fileroad, '遍历这个文件夹')
        fileOperation.getFileChildrenName(fileroad)
            .then((data) => {
                data.forEach(element => {
                    //先获取最外层的.md文件
                    if (isMd.test(element)) {
                        var stats = fs.statSync(`${fileroad}/${element}`)// 获得文件最新修改时间
                        var title = element.split('.');
                        element = title[0];
                        var info = [element, stats.mtime, type]
                        articleList.push(info);
                    } else {
                        if (!ignore.test(element)) {
                            getFileList(fileroad, element, element);
                        }
                    }
                })
            })
    }
}
function readArticleList() {
    console.log(articleList, "???")
    getFileList(articleRoad, '', 'public');
    console.log(articleList, "???")
}

readArticleList();

我想能等递归全部结束以后打印articleList。 image.png image.png

注意:我这个文件数量是动态的,以后我还会再添加

我想确定递归函数执行结束以后,使用最终的值,我要怎么解决?

11 回复

image.png 十分感谢各位,我自己已经解决了这个问题。有需要的人,可以使用我这个方法。

思路就是把递归换成队列的方式。

例如: var arr = [[1, 2, 3],[[[[[[11]]]]]], [4, [5]], [6, [7, 8, 9,[10]]]]; 得到 brr: [1, 2, 3, 4, 6,5, 7, 8, 9, 10,11]

把数组当成是一个文件夹,这样去不断遍历。

文字太多了,我把它写成博客了。有这个问题的朋友,可以参考;https://blog.csdn.net/lemisi/article/details/102551610

我原来的问题就是:

递归的方法不知道什么时候递归会结束;收集好我想要的文件放入列表中,用来执行下一行代码;

使用队列就可以知道什么时候结束了;收集好我想要的文件放入列表中,结束以后就可以用来执行下一行代码了。

最终的值 是什么?

如果“最终的值”定义为所有过滤出的 md 文件,那么用这个轮子试试 https://www.npmjs.com/package/rxwalker pipe() 最后用 reduce 操作符搜集所有输出值。

不大确定我这个是否能帮到你,但功能类似 Screen Shot 2019-10-13 at 9.54.55 AM.png

@waitingsong 最终的值就是我收集的所有md文件信息;

@Chenyating 我上面说的那个包可以遍历目录,文件和链接,然后逐个发射出来。你可以用 rxjs 的 reduce 操作符搜集所有的值然后一次性发射。 如果需要的是 Promise<file[]> 的返回类型,那么结果转换下 files$.toPromsie() 就行了。

另外,一楼图片中路径的写错了。五笔?

删除目录以及全部文件 image.png

那么复杂干嘛

await globby('**/*.md')

@atian25 哈哈,主要是想自己写。

回到顶部