我想获得包含在使用node的子目录的目录中的唯一文件名列表,并且在组合每个回调的结果时遇到一些麻烦。我想避免在重复操作,如果我只是从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()
函数并产生不良结果。如何实现一组文件名来处理;使用异步方法是否有一种很好的方法,即无需使用readdirSync
和statSync
?
答案 0 :(得分:1)
async模块将成为您的朋友。
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
});
答案 1 :(得分:1)
我建议使用promises吗?
function getNames(root) {
readdir = Q.nfbind(fs.readdir);
stat = Q.nfbind(fs.stat);
return readdir(root)
.then(function(list) {
files = [];
for(var i = 0; i < list.length; i++) {
file = root + '/' + list[i];
files.push(stat(file)
.then(function(stat) {
if (stat.isDirectory()) {
return getNames(file);
} else {
return path.basename(file);
}
})
);
}
return Q.all(files);
});
}
getNames('someDir')
.then(console.log)
.catch(console.error);