2013-05-03 190 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