인프런 커뮤니티 질문&답변

구너님의 프로필 이미지
구너

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

이벤트루프 알아보기

fsreadfile 같은 비동기 함수의 작동방식질문

작성

·

105

0

강좌에서 resolve()까지는 비동기로 진행이 된다고 하셨는데

fs.readfile로 예를 들었을때 fsreadfile에서 resolve를 호출하려면 파일을 읽어온 값이 resolve의 인자로 들어가야하는데 그 다음 resolve가 실행되고 그다음 then이 비동기로 간다고 생각됩니다.

그럼 만약에 (편의상 fs.readfile을 프로미스 방식으로 쓰겠습니다)

fs.readFile("somefile").then((data)=>console.log(data)));

console.log("Hi");

라고 코드가 있을때

실제로 Hi가 먼저 출력되는데 fs.readFile에서 실제로 이미 데이터를 먼저 다 읽어오고 resolve()가 호출되어야  Hi가 출력되고 그다음 큐에 있는 then부분의 익명함수 console.log(data)가 호출 스택으로 와서 실행 되는 것인가요?

resolve까지 동기로 진행된다고 하셨는데 원래 노드의 장점이 파일같은것을 주고 받는 서버로써 파일 같은 주고받는 작업이 백그라운드에서 진행되어야 한다고 들었습니다,.

그런데 제가 이해한 방식은 메인 쓰레드에서 resolve까지 동기식으로 처리가 되는듯해서 질문드립니다.

 

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

fs.readFile('somefile')이 실행된 다음에 fs.readFile 부분은 백그라운드로 가고요. 그 다음에 console.log('hi')가 되고, 백그라운드에서는 somefile을 열심히 읽고 있습니다. 그 후 다 읽은 다음에 프로미스 내부에 존재하는 resolve가 실행되어 태스크큐를 거쳐 then부분이 실행됩니다.

구너님의 프로필 이미지
구너
질문자

답변 감사드립니다 ㅠㅠ. 근데 자꾸 궁금증이 생겨서 하나만 더 여쭤보겠습니다.

readFile의 대충 생김새는 아래와 같을까요?

promise를 반환하는 그안에 실제로 파일을 읽어오는 함수가 있고 그 함수의 콜백함수에 resolve()가 되는 방식입니다.

제 생각으로는 이렇게 생겨야 말씀해주신 것과 같이 fs.readFile을 호출하면   Promise가 생성되고  Promise 생성자의 인자로 들어간 익명함수에서 실제파일읽는내부함수가 백그라운드로가서 값을 계산하고 콜백함수에서 resolve를 호출을 합니다.

function readFile('../somefile') {
  // new Promise() 추가
  return new Promise(function(resolve, reject) {
    실제파일읽는내부함수('../somefile', function(response) {
      // 데이터를 받으면 resolve() 호출
      resolve(response);
    });
  });
}
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 저런 꼴이 맞습니다.

구너님의 프로필 이미지
구너

작성한 질문수

질문하기