[자바스크립트] 비동기 처리 그렇게나 중요합니까 !

1
post-thumbnail

자바스크립트의 실행 순서실행 순서구조를 확인하도록 하지.

실행 컨텍스트(execution context)

1단계 자바스크립트의 모든 소스 코드는 실행에 앞서서 평가를 함
2단계 평가를 함으로써 실행 컨텍스트(execution context)생성
3단계실행 컨텍스트는 실행에 필요한 정보를 담고 있음(scope..등등)

실행 컨텍스트 스택=Call Stack

4단계 실행 컨텍스트를 콜스택에 푸시
5단계 코드가 순차적으로 실행

b() 함수 호출 - b 함수에 대한 평가 + b 함수의 실행컨텍스트 생성 - 콜스택에 푸시
b() 는 a()를 호출하고 있음 - a 함수에 대한 평가 + a 함수의 실행 컨텍스트 생성 - 콜스택에 푸시
a() 함수 실행종료 - 콜스택에서 pop !
c() 함수 호출 - ... - c() 함수가 종료되면
전역 실행 컨텍스트도 pop !

실행 대기 중인 테스크? b()가 a()함수를 호출하고, a()가 실행컨텍스트 위에 쌓이게 되면, 그 아래 쌓여 있는(먼저 호출된) 실행 컨텍스트를 실행 대기 중인 테스크라고 함

  • 콜스택은 단 하나 뿐이얌...소듕햇
  • 그래서 한번에 하나의 태스크만 실행이 가능 = 싱글쓰레드 방식

싱글쓰레드(동기처리)의 문제점 !

블로킹

  • 이전 테스크가 종요할 때까지 대기가 발생하는 현상

그렇지만, 실행 순서는 보장되잖아여 !

setTimeout 특이한데? (난, 비동기 처리 방식이지 !)

지금까지 정리한 것만으로 보면, setTimeout()을 먼저 호출했고, 콜스택에 쌓여있겠지? delay라는 매개변수를 이용해서 3초 동안 어딘가에 머무르고 그 사이에 b()가 먼저 호출되어 결과를 처리 한거군 !

실행순서가 보장이 안되지만, 블로킹이 없잖아?

그러면 뭐야? 자바스크립트 동기 처리 방식이라며, 비동기 처리였어?

setTimeout은 자바스크립가 제공하는 것이 아님 ! 브라우저가 제공하는 web API !

위에 setTimeout 3초 delay 동안 web api에 머무르고 있었군 !

Web API(DOM, Timer function, HTTP Request), 이벤트 루프, 테스크 큐

브라우저는 자바스크립트의 한계를 극복하기 위해 Web API를 제공하는 것

콜백을 사용하는 비동기 처리는 문제가 없을까?

1번 문제점 처리 결과를 외부로 반환하거나 상위 스코프의 변수에 할당하면 기대한 대로 동작하지 않음!

2번 문제점 콜백 지옥 들어봤죠?...;

3번 문제점 에러처리가 힘든편

참조

가만히 있을 수 없지 !

ES6 Promise / ES8 async/await을 도입 시킴...

profile
`나는 ${job} 개발자`

0개의 댓글