자바스크립트는 작업을 싱글스레드, 즉 하나의 호출 스택을 사용함.

호출 스택에 쌓인 함수나 코드를 위에서 아래로 차례대로 실행한다. (이거는 실제 VS코드 창에 적힌 순서를 말하는 건 아님). 하나의 작업이 끝이 나면 POP하고, 바로 아래의 함수나 코드를 실행한다.

즉, 작업을 차례대로 실행하기 때문에 하나의 작업이 끝날 때까지 또 다른 작업을 실행하지 않음.

Untitled

main() 함수는 처음 실행시 전역 컨텍스트(함수가 호출 되었을때 생성되는 환경)이다. 함수의 실행이 완료되면 호출 스택에서 지워진다. third, second, first, main 순으로 pop되고 main 함수까지 실행완료되면 호출 스택이 비워진다. 따라서 위 코드는 세번째, 두번째, 첫번째 순으로 콘솔에 찍힌다.

그렇다면 다음의 코드는 어떻게 실행될까?

const p2 = new Promise((resolve, reject) => {
  console.log("2");
  setTimeout(() => {
    resolve("두번째 프롬이스의 결과값입니다");
  }, 6000);
});

const p1 = new Promise((resolve, reject) => {
  console.log("1");
  setTimeout(() => {
    resolve("첫번째 프롬이스의 결과값입니다");
  }, 3000);
});

p1.then((res) => {
  console.log(res);
});

p2.then((res) => {
  console.log(res);
});
PS C:\\Users\\samsung\\Desktop\\JS-lang> node promise.js
2
1
첫번째 프롬이스의 결과값입니다
두번째 프롬이스의 결과값입니다

동기적으로 작동하는 코드는 작성한 순서대로 위에서 아래로 실행된다.

비동기적으로 작동하는 코드는 작성한 순서대로가 아닌 주어진 작업이 먼저 완료되는 것부터 터미널에 출력되는 것을 알 수 있다.