Node.js在完成整个函数之前执行回调

时间:2015-11-22 16:49:55

标签: javascript node.js express

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。因为这个我在网页上得到了空洞的回应。有没有办法解决这个问题。

1 个答案:

答案 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)