我的函数是返回空对象列表a

时间:2018-03-01 19:23:52

标签: node.js

我创建了一个填充对象列表的函数,但它们没有被写入。

if (stats.isDirectory()) {
        objlist=[];
        //do something here.. the path was correct
        fs.readdir(path, (err, files) => {
            objlist=[];
            for(file in files){
                //console.log(files[file])
                objlist[file]={};
                fs.stat(path + '\\' + files[file], function(err,stats){
                    if(err)
                        throw err;
                    if(stats.isDirectory()){
                        objlist[file]['file'] = 'folder'
                    }
                    if(stats.isFile()){
                        objlist[file]['file'] = 'file'
                    }
                    objlist[file]['name'] = files[file]
                    objlist[file]['size'] = stats.size
                    //console.log(objlist)
                    //console.log(stats)
                });
            }
        });
      console.log(objlist);
      return objlist;
    }

但是该函数返回一个空的objlist;你能告诉我我做错了吗

3 个答案:

答案 0 :(得分:1)

这段代码将是helphul。使用let file in files

 objlist=[];
        //do something here.. the path was correct
        fs.readdir(path, (err, files) => {

            objlist=[]; 
            for(let file in files){
                objlist[file]={};
                fs.stat(path + '\\' + files[file], function(err,stats){
                    if(err)
                        throw err;
                    if(stats.isDirectory()){
                        objlist[file]['file'] = 'folder'
                    }
                    if(stats.isFile()){
                        objlist[file]['file'] = 'file'
                    }
                    objlist[file]['name'] = files[file]
                    objlist[file]['size'] = stats.size

                    if(file == files.length-1) {
                        console.log(objlist);
                    }
                });
            }
        });

答案 1 :(得分:0)

您必须使用方法push将对象添加到数组中,如下所示:

objlist=[];
for(file in files){
    obj = {};
    obj.file = file;
    //... do all stuff with obj
    objlist.push(obj);
}

此外,您的函数在fs.readdir内是异步的,因此如果您必须在函数中构建和填充,或者等待接收结果。

否则你将调用该函数,它将异步执行,你将继续执行main函数而不等待fs.readdir的响应,并且数组将继续为空,因为你的异步函数可能会也可能不会已被执行。

答案 2 :(得分:0)

您的代码中有两个错误: -

1)您正在使用数组作为对象

2)因为for循环是同步循环,你在其中尝试异步任务,因此要么使用fs的同步版本,要么改变你的for循环,如下所示: -

for(file in files) {
    obj = {};
    obj[file]={};
    (function(f){
                fs.stat(path + '\\' + files[f], function(err,stats){
                    if(err)
                        throw err;
                    if(stats.isDirectory()){
                        obj[file]['file'] = 'folder'
                    }
                    if(stats.isFile()){
                        obj[file]['file'] = 'file'
                    }
                    obj[file]['name'] = files[file]
                    obj[file]['size'] = stats.size
                    objlist.push(obj)
                    //console.log(objlist)
                    //console.log(stats)

                });
            }
    }(file))
}