2016-12-22 1 views
0

여러 디렉토리를 반복하여 그 디렉토리 내의 파일이 NodeJS 및 fs.stat()와 함께 존재하는 경우 시도합니다.FOR 루프에서 NodeJS - fs.stat()가 무시됩니다.

나는 그 특정 디렉토리 안에 "project.xml"이 있는지 확인하기 위해 fs.stat() 호출을 통해 디렉토리를 반복하는 간단한 for-loop를 가지고있다. 내 코드는 다음과 같습니다

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() 출력 모두 제대로 디렉토리,하지만 내부의 코드 내부 fs.stat는()를 호출하고 마지막에 한 번만 실행되지 않는 경우 루프의 내 콘솔이를 보여줍니다

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

는하지만 내가 찾는있는 project.xml은 Vala/하지testapp/에 있지만 Vala/prDirs의 마지막 항목입니다.

위의 코드는 내 최신 시도, 내가 해봤 다른 유사 많은 한 (나는 fs.stat() 내부 ifelse을 추가) fs.stat() 실제로 가 호출됩니다 것을, 저를 보였으 나있는 내부 코드 만 if이 실행 중이 아니며 else에 코드가 추가 된 경우 은 실행 중입니다.

미리 감사드립니다.

+0

빠른 수정은'var' 대신'let'을 사용하는 것이지만 궁극적으로는 비동기 함수 호출을 읽는 것이 좋습니다. – robertklep

답변

0

fs.stat은 비동기 I/O 함수이므로 주 스레드가 유휴 상태 일 때 또는 해당 경우에만 for 루프가 완료된 후에 만 ​​해당 콜백이 호출됩니다. for 루프 대신에 비동기 문제에서 폴더를 반복하는 것이 좋습니다. async.each, async.eachSeries을 사용하거나 직접 구현할 수 있습니다.

0

Async에서 @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' ] 

희망를 기록합니다.

관련 문제