Javascript 为什么我能';在数组中推送文件?

Javascript 为什么我能';在数组中推送文件?,javascript,node.js,recursion,filesystems,Javascript,Node.js,Recursion,Filesystems,我有一个递归查找文件的函数。 如果指定了类型D,我只希望将文件夹添加到数组中。如果是F类型,则仅限于文件。它适用于文件搜索。但是如果类型为D,则无法添加任何内容,尽管可以输出到控制台。 为什么我不能添加到数组中,如何修复它 const type = T or D const walk = (dir, done) => { let results = []; return new Promise((resolve, reject) => { fs.re

我有一个递归查找文件的函数。 如果指定了类型D,我只希望将文件夹添加到数组中。如果是F类型,则仅限于文件。它适用于文件搜索。但是如果类型为D,则无法添加任何内容,尽管可以输出到控制台。 为什么我不能添加到数组中,如何修复它

const type = T or D

const walk = (dir, done) => {
    let results = [];
    return new Promise((resolve, reject) => {
        fs.readdir(dir, (err, list) => {
            if (err) return done(err);
            let pending = list.length;
            if (!pending) return done(null, results);
            list.forEach((file) => {
                file = path.join(dir, file);
                fs.stat(file, function (err, stat) {
                    if (stat && stat.isDirectory()) {
                        if (type && type === 'D') {
                            console.log(file)
                            results.push(file);
                        }
                        walk(file, (err, res) => {
                            results.push(...res);
                            if (!--pending) done(null, results);
                        });
                    } else {
                        if (type === 'F') {
                            results.push(file);
                            if (!--pending) done(null, results);
                        }
                    }
                });
            });
        });
    })
};

walk(baseDir, (err, results) => {
    if (err) throw err;
    console.log(results);
});

type
D
时,您当前仅在
if(stat&&stat.isDirectory())
块内减少
pending
,但是
pending
的数量也取决于目录中的文件数,因为
let pending=list.length

解决此问题的一种方法是在
else
中减少
pending
,不管:

} else {
    if (type === 'F') {
        results.push(file);
    }
    if (!--pending) done(null, results);
}
或者,为了更简洁,避免一些回调地狱,可以使用
async
函数和
wait
来代替,然后可以使用
Promise.all
来代替手动检查标记(这很繁琐,而且可能容易出错)。这也会使函数正确地返回承诺(当
done
未通过时):


type
D
时,您当前仅在
if(stat&&stat.isDirectory())
块内减少
pending
,但是
pending
的数量也取决于目录中的文件数,因为
let pending=list.length

解决此问题的一种方法是在
else
中减少
pending
,不管:

} else {
    if (type === 'F') {
        results.push(file);
    }
    if (!--pending) done(null, results);
}
或者,为了更简洁,避免一些回调地狱,可以使用
async
函数和
wait
来代替,然后可以使用
Promise.all
来代替手动检查标记(这很繁琐,而且可能容易出错)。这也会使函数正确地返回承诺(当
done
未通过时):


这是一个奇怪的实现。您正在返回一个承诺(您永远无法解决)并接受
done()
回调。您还缺少几个地方的错误处理。这是一个奇怪的实现。您正在返回一个承诺(您永远无法解决)并接受
done()
回调。您还缺少几个地方的错误处理。