[엘리스 sw 엔지니어 트랙] 17일차 비동기, 이벤트루프, Promise,

오경찬·2022년 5월 3일
0

수업 17일차

오늘은 어제 배웠던 비동기, 이벤트, Promise를 다시 배웠다. 어제 내용에 정리 해뒀으니 어제 없는 이벤트 루프만 정리하도록 하겠다~

이론

  • 자바스크립트 엔진 : 하나의 메인 스레드로 구성됨, 코드를 읽어 한 줄씩 실행
    비동기 API : 비동기 코드에서 정해진 함수
    Promise API : 비동기 API중 하나, task 큐가 아닌 job큐 사용
    Promise 생성자 : callback 함수는 (resolve, reject) 두인자를 받음, 성공시 resolve 호출,실패시 reject호출
    then() : 성공했을 때 실행할 콜백 함수를 인자로 넘긴다.
    catch() : 실패했을 때 실행할 콜백 함수를 인자로 넘김
    finally() : 성공/실패 여부와 상관없이 모두 실행할 콜백 함수를 인자로 넘김

호출스택

호출스택은 한마디로 자바스크립트에서 호출된 함수를 스택에 쌓아서 올린다는 개념을 의미한다.
하나씩 쌓아진 함수는 차곡차곡 쌓이게 되며 결과적으로 더이상 스택에 쌓을게 없다면
위에서 부터 하나씩 pop하는 형태로 실행 되게 된다.

Uncaught RangeError: Maximum call stack exceeded

가끔가다 이런 오류가 콘솔창에 뜨는것을 볼 수 있을텐데 이 오류가 바로 콜 스택에 더이상 쌓아 올릴수 없을 만큼 가득 차서 터진상태다!! 라고 볼 수 있다. (흔히 재귀함수를 잘못 설계하였을 때 발생하는 실수)

그러므로 코드를 짤 때 콜스택이 안터지도록 잘 설계해서 짜야한다.

이벤트 루프

자바스크립트는 흔히 싱글 쓰레드로 동작한다고 알고있는데 바로 여기서 이벤트 루프가 동작되는 것입니다.

function Foo() {
  console.log("1");
}

function Baz() {
  console.log("2");
}

function Bar() {
  console.log("3");
}

Foo(); // 1
Baz(); // 2
setTimeout(()=> {
  console.log("4");
},0) // 4
Bar(); // 3

예상하기에는 setTimeOut이 0초니깐

1
2
4
3

순으로 콘솔창에 찍힐거라고 생각하겠지만, 결과는 틀리게 나온다. 그 이유는 아래에서 살펴볼 수 있다

그림에서 보다시피 Foo, Baz이 순서대로 스택에 쌓이게 되고
다음줄인 setTimeout으로 실행 된 것은 Web ApI로 타이머 이벤트를 요청한다.
그리고 마지막 Bar를 스택에 쌓는다.
(이때 0초가 지나게 되면 해당 콜백함수를 순차적으로 콜백 큐에 집어넣게 된다.)

그리고 스택에는 Bar Baz Foo를 꺼내게 되고, 스택은 비워지게 된다.

여기서 이벤트 루프는 현재 스택이 비워져 있다면 큐의 콜백 함수인 setTimeout의 console.log("4")를 실행시키게 되고 결과적으로

1
2
3
4

이렇게 찍히게 된다.

결과적으로 위에 설명한 순서대로 자바스크립트의 이벤트루프가 동작하므로 앞으로 코딩할 때 숙지 하고 있다면 원하지 않는 결과라던가, 오류가 발생하더라도 큰 문제 없이 문제 해결을 할 수 있을거라 생각한다.

profile
코린이 입니당 :)

0개의 댓글