2017-07-28 75 views
-1

我想从一个特定的目录中读取所有(文本)文件,它是递归的所有子目录。我能够读取文件并将结果附加到全局变量。但我想在所有操作结束时访问变量。我正在尝试承诺,但我无法访问它。请帮助 节点js具有递归功能的承诺

var file_path = `C:\\Users\\HP\\Desktop\\test_folder`; 
 
const fs = require('fs'); 
 
var final_array = []; 
 

 
let getFolderTree = function(file_path) { 
 
    return new Promise(function(resolve, reject) { 
 

 
    fs.readdir(file_path, function(err, folders) { 
 
     if (err) { 
 

 
     console.log("error reading folder :: " + err); 
 

 
     } else { 
 

 
     if (folders.length !== 0) { 
 

 
      for (let i = 0; i < folders.length; i++) { 
 

 
      if (folders[i].endsWith("txt")) { 
 

 
       let text_file_path = file_path + `\\` + folders[i]; 
 
    
 
       fs.readFile(text_file_path, function(error_read, data) { 
 
       if (error_read) { 
 
        console.log("error reading " + error_read); 
 
       } else { 
 
        
 
        return resolve(final_array.push(data));// want to access final_array at the end of all operations 
 
       } 
 
       }); 
 
       
 
      } else { 
 
       let current_path = file_path + `\\` + folders[i]; 
 
       getFolderTree(current_path); 
 
      } 
 
      } 
 
     } 
 
     } 
 
    }); 
 
    }); 
 
} 
 
getFolderTree(file_path).then(function() { 
 
    console.log(final_array); // this is not working 
 
});

+0

如果我理解你的问题是什么,你要添加'then'和'catch'到你的递归调用:'getFolderTree(current_path).then(/ * do something * /)。catch(/ * handle error * /);'另外,如果我正确地读你的代码, '循环不会做你想做的事。而且你会希望确保你的承诺在任何情况下都能解决/拒绝。 –

回答

0

我想我已经找到了解决办法,但我仍然感到困惑的是如何工作的。

我参考了另一个代码,并能够找出一些方法。

请让我知道,如果有人有更好的解决方案 也请帮助我理解代码

var fs = require('fs'); 
 
var path = require('path'); 
 
let root_path = "C:\\Users\\HP\\Desktop\\test_folder"; 
 

 
function getAllDirectoriesPath(current_path) { 
 
    var results = []; 
 
    return new Promise(function (resolve, reject) { 
 
     fs.readdir(current_path, function (erro, sub_dirs) { 
 
      if (erro) { 
 
       console.log(error); 
 
      } else { 
 
       let no_of_subdir = sub_dirs.length; 
 
       if (!no_of_subdir) { 
 
        return resolve(results); 
 
       } else { 
 
        sub_dirs.forEach(function (dir) { 
 
         dir = path.resolve(current_path, dir); 
 
         fs.stat(dir, function (err, stat) { 
 
          if (stat && stat.isDirectory()) { 
 
           getAllDirectoriesPath(dir).then(function (res) { 
 
            results = results.concat(res); 
 
            if (!--no_of_subdir) { 
 
             resolve(results); 
 
            } 
 
           }); 
 
          } else { 
 
           fs.readFile(dir, function (err, data) { 
 
            results.push(data.toString()); 
 
            if (!--no_of_subdir) { 
 
             resolve(results); 
 
            } 
 
           }); 
 

 
          } 
 
         }); 
 
        }); 
 
       } 
 
      } 
 
     }); 
 
    }); 
 
} 
 

 
getAllDirectoriesPath(root_path).then(function (results) { 
 
    console.log(results); 
 
});