Javascript 为什么我能';在数组中推送文件?
我有一个递归查找文件的函数。 如果指定了类型D,我只希望将文件夹添加到数组中。如果是F类型,则仅限于文件。它适用于文件搜索。但是如果类型为D,则无法添加任何内容,尽管可以输出到控制台。 为什么我不能添加到数组中,如何修复它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
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()
回调。您还缺少几个地方的错误处理。