inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

이벤트루프 알아보기

이런 코드는 어떤식으로 동작하나요?

130

구너

작성한 질문수 4

0

async function f() {
    console.log("Hei2");

    let promise = new Promise((resolvereject=> {
        setTimeout(() => resolve("완료!"), 1000);
    });

    let result = await promise// 프라미스가 이행될 때까지 기다림 (*)

    console.log(result); // "완료!"
    console.log("Hei3");
}

f();

console.log("Hei");

위와 같은 코드를 분석중인데요.

처음에 호출스택에 f()가 들어가고 console.log('Hei2'); 가 호츨스택에 실행되어서 나와 출력되고 그 다음 프로미스가 생성되어서 setTimeout()이 호출스택에 들어가서 실행되고 백그라운드에 1초짜리 timer가 올라가고 1초후에 task큐로가서 호출스택에 아무것도 없으면 then이 실행되어 result에 해당 값이 들어가고 console.log(result)와 console.log("Hei3")가 출력된다고 생각되었습니다.

실제 출력 결과는

Hei2 -> Hei -> 완료! -> Hei3 순인데

함수 f는 프로미스가 이행될때까지 pause상태인데 어떤식으로 중간에 Hei가 호출스택에 쌓이고 출력되는 것인지 잘 모르겠어 질문드립니다.

제 추측은 await 밑이 전부 then 함수처럼 처리되어서 백그라운드로가게 되고 f()가 종료되어 호출스택에서 나와서 Hei가 먼저출력되고 그다음 백그라운드에있던 await promise밑 부분들이 테스크 큐로들어와 이벤트루프에 의해 호출컨텍스트로 들어와 최종적으로 실행되는 것입니다.

Sequelize mysql nodejs mongodb

답변 1

1

제로초(조현영)

네 맞습니다. await을 만나는 순간 promise의 then과 같습니다. 거기서 함수 f는 호출스택에서 빠져나오게 됩니다. 이 때 Hei가 호출스택에 들어가서 호출됩니다.

나중에 resolve되는 순간 await 부분부터 재개가 됩니다(태스크큐->호출스택)

0

구너

감사합니다~

리눅스 노드 설치시 패키지

0

172

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

926

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2297

2

a[title] 질문드립니다

0

386

1

리뉴얼 강의 및 공부 방법

0

589

1

jwt decode

0

1137

1

node.js 교과서 3판 질문드립니다

0

396

1

passport와 jwt

0

438

1

리뉴얼 강의

0

427

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

359

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

488

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

511

2

nunjucks res.render('error'); 작동을 안합니다.

0

518

1

질문있습니다.

0

348

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3543

1

수업자료는 어디있나요?

0

374

1

질문 있습니디

0

244

1

multer 사용시 file 외 name값은 못받나용?

0

429

1

코드 중복 부분 질문드립니다.

0

303

1

api 만드는 이유 질문드립니다.

0

292

1

Strategy의 done에 대해 질문드립니다.

0

373

1

안녕하세요 fs 권한 관련 질문드립니다

0

455

1

시퀄라이즈 연결질문...

0

510

2

res.setHeader vs res.cookie

0

1797

3