2016-09-28 2 views
0

"learnyounode"를 사용하여 node.js를 배우려고합니다. 폴더 경로와 파일 확장자 유형을 입력으로 가져온 다음 해당 폴더에있는 해당 유형의 모든 파일을 출력으로 제공해야하는 곳이 있습니다. 이 프로그램 구축 한 :node.js의 콜백 함수에서 객체를 배열에 푸시 할 수없는 이유는 무엇입니까?

var fs = require('fs'); 
var pathModule = require('path'); 
var path = process.argv[2]; 
var ext = '.'.concat(process.argv[3]); 
filteredList = []; 
fs.readdir(path,function doneReading(err, list){ 
    for(var i = 0; i < list.length; i++){ 
     if(pathModule.extname(list[i]) == ext){ 
      filteredList.push(list[i]); 
     } 
    } 
    }) 

for(var i = 0; i < filteredList.length; i++){ 
    console.log(filteredList[i]); 
} 

을 몇 가지 이유

filteredList.push(list[i]); 

의 filteredList의 내용에 영향을 미치지 않습니다. 왜 이런거야? console.log를 readdir-function 내부로 옮겨서 운동을 해결했지만 psuh가 작동하지 않는 이유는 모르겠습니다.

+1

fs.readdir가 비동기이 당신의 코드를 변경 시도 –

답변

0

doneReading 기능은 filteredList에 영향을 미치며, 단지 기다리지 않고 기다리는 것입니다. fs.readdir 함수는 비동기식이므로 콜백이 필요합니다. 콜백은 호출하는 메소드가 작업을 마칠 때 호출됩니다. 콜백은 프로그램 실행을 차단하지 않으므로 목록 null이 인쇄됩니다. 출력이 콜백 내부의 목록과 출력 것이다 올바르게 - fs.readdir가 콜백 함수를 호출 한 전에 filteredList를 출력하고 -

fs.readdir(path,function doneReading(err, list){ 
    for(var i = 0; i < list.length; i++){ 
     if(pathModule.extname(list[i]) == ext){ 
      filteredList.push(list[i]); 
     } 
    } 
    for(var i = 0; i < filteredList.length; i++){ 
     console.log(filteredList[i]); 
    } 
}) 
관련 문제