有一个函数,我可以用来读取目录中的所有文件,然后将带有发射器的对象发送给客户端。
这是我的代码,可以正常工作,
const getFilesList = (path, emitter) => {
fs.readdir(path, (err, files) => {
emitter('getFileList', files);
});
};
但是当我想用此代码过滤隐藏文件时,“ standardFolders”将在发射器中发送为空。
const getFilesList = (path, emitter) => {
let standardFolders = [];
fs.readdir(path, (err, files) => {
if (files) {
files.map((file) => {
winattr.get(path + file, function (err, attrs) {
if (err == null && attrs.directory && (!attrs.hidden && !attrs.system)) {
standardFolders.push(file)
}
});
});
} else {
standardFolders = null;
}
emitter('getFileList', standardFolders);
});
};
第二部分的代码有什么问题?
最佳答案
winattr.get(filepath,callback)
是异步的,因此可以想象您的代码“开始”在file.map()
行中,然后立即跳到emitter('getFileList',standardFolders)
--- standardFolders
为空,因为它尚未完成!
您可以使用async.io之类的库来处理您的回调函数,也可以使用计数器并跟踪所有回调(针对每个文件)何时完成。
例:
// an asynchronous function because setTimeout
function processor(v,cb){
let delay = Math.random()*2000+500;
console.log('delay',delay);
setTimeout(function(){
console.log('val',v);
cb(null,v);
},delay);
}
const main = function(){
const list = ['a','b','c','d'];
let processed = [];
let count = 0;
console.log('starting');
list.map(function(v,i,a){
console.log('calling processor');
processor(v,function(err,value){
processed.push(v);
count+=1;
console.log('count',count);
if(count>=list.length){
// all are finished, continue on here.
console.log('done');
}
})
})
console.log('not done yet!');
};
main();
同样,对于您的代码:
const getFilesList = (path, emitter) => {
let standardFolders = [];
fs.readdir(path, (err, files) => {
if (files) {
let count = 0;
files.map((file) => {
winattr.get(path + file, function (err, attrs) {
if (err == null && attrs.directory && (!attrs.hidden && !attrs.system)) {
standardFolders.push(file)
}
count+=1;
if(count>=files.length){
// finally done
emitter('getFileList', standardFolders);
}
});
});
} else {
standardFolders = null;
emitter('getFileList', standardFolders);
}
});
};
关于javascript - Node.js发射器在回调上为空数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54005967/