有一个函数,我用它来读取目录中的所有文件,然后将带有发射器的对象发送到客户端。
这是我的代码,运行良好,
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/