NodeJS - 在FOR循环

时间:2016-12-22 15:35:13

标签: node.js for-loop

我试图遍历一堆目录,然后尝试使用NodeJS和fs.stat()存在该目录中的文件。

我有一个简单的for循环遍历目录,并在其中调用fs.stat()来检查,如果" project.xml"在该特定目录中存在。我的代码如下所示:

for (var i = 0, length = prDirs.length; i < length; i++) {
  var path = Config["ProjectDirectory"] + "/" + prDirs[i];
  console.log("PATH=" + path);
  fs.stat(path + "/project.xml", function (err, stat) {
    if (err == null) {
      console.log("  => PATH=" + path);
    }
  })
}

NodeJS在目录上正确循环,console.log()正确输出所有目录,但是ifs fs.stat()里面的代码没有被调用,只在循环结束时运行一次。我的控制台显示了这个:

PATH=(...)/PHP
PATH=(...)/Electron
PATH=(...)/testapp
PATH=(...)/Vala
  => PATH=(...)/Vala/project.xml

但我正在寻找的project.xml位于testapp/的{​​{1}} 而非,但Vala/是{{1}中的最后一个条目}}

上面的代码是我最近的尝试,我尝试了很多其他变体,其中一个(我在Vala/ prDirs内附加了else)向我展示了if实际获取,但只有fs.stat()内的代码没有运行,fs.stat()我添加一次后的代码跑步。

提前致谢!

2 个答案:

答案 0 :(得分:0)

fs.stat是一个异步i / o函数,因此只有在主线程空闲后才会调用它的回调,或者只在for循环完成后调用它。而不是for循环,我建议在异步事件中迭代文件夹。您可以使用async_read_until()async.each或自行实施。

答案 1 :(得分:0)

@Gil Z在异步中提到fs.stat。如果你想为每个循环保留并使代码看起来同步,我建议使用promises

这是一个例子。适用于节点v 6.9

"use strict";
const fs = require('fs');
let paths = ["tasks", "aaa", "bbbb"];
//method to get stat data using promises
function checkFileExists(path) {
    return new Promise((resolve, reject) => {
       fs.stat(path + "/project.xml", (err, res) => {
           resolve(err ? "Not found in " + path : "  => PATH=" + path);
       });
   });
}
//create promise array with each directory
let promiseArr = [];
paths.forEach(pathPart => {
    let path = process.cwd() + "/" + pathPart;
    promiseArr.push(checkFileExists(path));
});
//run all promises and collect results
Promise.all(promiseArr)
.then(reslut => {
    console.log(reslut);
})
.catch(e => console.log("Error in promises"));

以上代码将记录此

[ '  => PATH=/Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/tasks',
  'Not found in /Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/aaa',
  'Not found in /Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/bbbb' ]

希望这有帮助。