2013-05-03 192 views
1

以下代码构建文件夹中文件的字典(关联数组),跳过目录和隐藏(。*)文件。系数是因为console.log(file_dict)在返回之前显示字典。然而,当我打电话get_files功能,从return file_dict返回值是undefined为什么fs.readdir返回`undefined`?

我敢肯定,这个问题是因为readdir是异步。所以,我需要切换到readdirSync。但从概念上说,我不明白为什么异步版本中的返回值是未定义的。

我错过了什么?

文件explorer.js

var fs = require('fs'); 

    var get_files = function() { 
     fs.readdir(__dirname + '/content/', function (err, files) { 
      if (!files.length) { 
      return console.log(' \033[31m No files to show\033[39m\n'); 
      } 

      // called for each file walked in the directory 
      var file_dict = {}; 
      var file_index = 0; 

      function file(i) { 
      var filename = files[i]; 

      fs.stat(__dirname + '/' + filename, function (err, stat) { 

       if (stat.isDirectory() || filename[0] == '.' ) { 
        // do nothing, skip these dictionaries and dot files 
       } else { 
       ++file_index; 
       file_dict[file_index] = filename; 
       }; 

       if (++i == files.length) { 
          console.log('right before returning'); 
       console.log(file_dict); 
       return file_dict; 
       } else { 
       // continue getting files 
       file(i); 
       }; 
      }); 
      } 
      file(0); 
     }); 
    } 


console.log (get_files()); // returns undefined 

感谢。

回答

6

异步函数不返回。他们用他们的返回值调用他们的回调。

考虑:

var get_files = function (cb) { 
    fs.readdir(__dirname + '/content/', function (err, files) { 
     if (!files.length) { 
      return console.log(' \033[31m No files to show\033[39m\n'); 
     } 

     // called for each file walked in the directory 
     var file_dict = {}; 
     var file_index = 0; 

     function file(i) { 
      var filename = files[i]; 

      fs.stat(__dirname + '/' + filename, function (err, stat) { 

       if (stat.isDirectory() || filename[0] == '.') { 
        // do nothing, skip these dictionaries and dot files 
       } else { 
        ++file_index; 
        file_dict[file_index] = filename; 
       }; 

       if (++i == files.length) { 
        console.log('right before returning'); 
        console.log(file_dict); 
        return cb(file_dict); 
       } else { 
        // continue getting files 
        return file(i); 
       }; 
      }); 
     } 
     return file(0); 
    }); 
} 


get_files(function (v) { console.log(v); }); 
+0

大。大。我开始得到它,并且我添加了你添加的行。有用。我认为我需要重构并尝试以另一种方式做到这一点。 – 2013-05-04 00:01:31