javascript / nodejs 관련

조회수 474회

nodejs 관련 간단한 함수 작성 중입니다.

function templateList(){

  var templateList;

  fs.readdir('./data',function(err,fileList){

    //./data 안의 파일의 갯수는 총 3개입니다.

    templateteList  = `<ul>`;
    for(var i = 0 ; i < fileList.length ; i++){
      templateList += `<li>${i}</li>`;

    }
    templateList += `</ul>`;
  });

  return templateList;

}

위의 코드에서 templateList 의 예상 결과값은 <ul><li>1</li><li>2</li><li>3</li></ul> 입니다.

하지만 결과값은 <ul></ul> 가 나옵니다.

이유 아시는분 답변 부탁드립니다 ㅠㅠ

3 답변

  • fs.readdir 는 비동기로 동작합니다.

    node 의 장점이자...익숙하지 않아서 발생하는 pain point 이기도 하죠.

    위의 코드에서 fs.readdir 는 비동기이므로 리턴없이 즉시 끝나는 겁니다.

    즉 동기적으로 기다리지 않고 바로 templateList 를 리턴할겁니다.

    • 아마 이부분이 문제였던거 같습니다. fs.readdir 과 fs.readFile에서 둘 다 발생하는 문제였거든요.. 비동기로 처리할 수 있는 방법을 생각해봐야겠군요.. 알 수 없는 사용자 2020.6.16 20:05
    • 방법은 정해져 있는 겁니다. callback 이죠. 문제는 callback 으로 처리하다보면 중첩된 callback 을 호출하게 되기 때문에 가독성이나 유지보수가 아주 힘든 형태가 됩니다. 그럼 지금의 해법은? 바로 async, await 키워드를 사용해서 깔끔하게 처리할 수 있습니다. 한번 학습해보세요. callback -> promise -> async, await 순으로... 정영훈 2020.6.16 23:35
    • 감사합니다 동기,비동기는 생각도 못했던 내용인데, 아직 배울점이 많네요 정영훈님이 말씀해주신 부분을 꼭 학습하겠습니다. 알 수 없는 사용자 2020.6.16 23:56
  • for 문 들어가기 전에 fileList.length값을 console.log( )로 한 번 확인해보세요.

    0 이거나 0보다 작다면 for문 내부로 진입하지 않고 다음 문장을 실행합니다.

    그럼 결과는 <ul></ul> 이 될 수도 있습니다.

    • console.log로 띄우면 정상적으로 나옵니다. for문 내부에서도 console.log로
    • 1
    • 2
    • 3
    • 가 정상 출력되는걸 확인했는데말이죠 .. ㅜㅜ 알 수 없는 사용자 2020.6.16 20:04
  • 혹시나 저와 같은 문제로 헤메실 분들을 위하여 말씀드립니다...

    아주 기초적인 문제여서 부끄럽지만..

    function templateList(){

       var templateList  = `<ul>`;
    
    
      var fileList = fs.readdirSync('./data');
    
    
      for(var i = 0 ; i < fileList.length ; i++){
    
        templateList += `<li>${i}</li>`;
    
      }
    
    templateList += `</ul>`;
    
    return templateList;
    

    }

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)