var fs=require('fs');
var path=require('path');
module.exports.getFiles=function(filepath,callback) {
var files=[];
fs.exists(filepath,function(exists){
if(exists){
fs.stat(filepath,function(error,stats){
if(error){}
else{
if(stats.isDirectory()){
fs.readdir(filepath,function(error,filelist){
if(error){}
else{
filelist.forEach(function(file){
var obj={};
fs.stat(path.join(filepath,file),function(error,stats){
if(error){}
else{
if(stats.isDirectory()){
obj.type='directory';
}
else{
obj.type='file';
}
obj.name=file
console.log(obj);
files.push(obj);
}
});
});
console.log("callback")
callback(files); //problem is here
}
});
}
}
});
}
});
}
我写了一个函数,从给定路径获取文件列表。我正在发送一个回调函数。回调函数呈现响应网页。但是在完成整个函数之前执行Callback。因为这个我在网页上得到了空洞的回应。有没有办法解决这个问题。
答案 0 :(得分:0)
除了非常糟糕的错误处理,这是一个打开许多错误的窗口。
您基本上是在fs.stat
循环内执行异步方法forEach
。
循环触发fs.stats
filelist.length
次,然后执行回调,而没有fs.stats
结果
编辑: 这是在不使用async.js或promise的情况下执行此操作的方法,请注意,回调具有错误处理的第一个参数,以及所需文件的第二个参数
function getStatForFiles(index,callback){
if(index < filelist.length){
fs.stat(path.join(filepath,filelist[index]),function(error,stats){
if(error){
callback(error)
}else{
var obj = {};
if(stats.isDirectory()){
obj.type='directory';
}else{
obj.type='file';
}
obj.name=file
console.log(obj);
files.push(obj);
getStatForFiles(++index,callback)
}
});
}else{
callback(null,files)
}
}
getStatForFiles(0,callback)