我想获取包含在使用节点的子目录的目录中的唯一文件名列表,并且在合并每个回调的结果时遇到了一些麻烦。我想避免对重复项进行操作,如果我只是从fs.stat
回调中记录文件名,就会发生这种情况。
var distinct = {};
function getNames(root) {
fs.readdir(root, function(err, list) {
list.forEach(function(file) {
file = root + '/' + file;
fs.stat(file, function(err, stat) {
if (!err && stat.isDirectory()) {
getNames(file);
} else {
distinct[path.basename(file)] = true;
}
});
});
});
}
// perform various operations on unique filename list
console.log(Object.keys(distinct));
当然,这调用该console.log()
函数为时过早,并且会产生不希望的结果。如何获得一组可使用的文件名;是否有一种使用async方法做到这一点的好方法,即,不必使用readdirSync
and statSync
?
异步模块将在这里成为您的朋友。
var distinct = {};
function getNames(root, callback) {
fs.readdir(root, function(err, list) {
if (err) return callback(err);
async.each(list, function(file, done) {
fs.stat(file, function(stat) {
if (err) return done(err);
if (stat.isDirectory()) return getNames(file, done);
distinct[path.basename(file)] = true;
done();
});
}, function(err) {
// called when all done or error
callback(err, distinct);
})
});
}
然后你可以像这样使用它
getNames('path/to/dir', function(distinct) {
// logic
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句