漂亮的代码2:遍历文件夹目录,使用promise

看到一个问题: 找到文件夹下所有文件:
自己写了一个:

function walk(dir, ext, callback) {
    ext = ext.charAt(0) === "." ? ext : `.${ext}`;

    fs.readdir(dir, (err, files) => {
        files.forEach(f => {
            fs.lstat(path.join(dir, f), (err, st) => {
                if (st.isDirectory()) {
                    walk(path.join(dir, f), ext, callback);
                } else {
                    if (path.extname(f) === ext) {
                        callback(null, f);
                    }
                }
            })
        });
    });
}

没有想到很好的办法,获得返回值。网上找了找:

function walk(dir) {
  
    let readDirAsync = Promise.promisify(fs.readdir);
    let lstatAsync = Promise.promisify(fs.lstat);

    return readDirAsync(dir).then(files => {

        return Promise.all(files.map(f => {
            let file = path.join(dir, f);

            return lstatAsync(file).then(stat => {
                if (stat.isDirectory()) {
                    return walk(file);
                } else {
                    return [file];
                }
            });
        }));
    }).then(files => {
        return files.reduce((pre, cur) => pre.concat(cur));
    });	
}

walk("~/home").then(x => console.log(x));

自己写成了一堆屎,好好学习。

posted @ 2016-05-25 20:05  htoooth  阅读(800)  评论(0编辑  收藏  举报