자바스크립트는 싱글 스레드 언어이기 때문에
한 번에 한 가지의 일 밖에 처리하지 못한다
하나의 작업 흐름만을 가질 수 있다
때문에 작업이 오래 걸리거나
대기를 해야하는 작업이 있는 경우
프로그램 전체가 대기해야 한다
이러한 문제를 해결하기 위해서 자바스크립트에서는
몇몇 함수들을 미리 비동기 함수로 만들어 놓았다
addEventListener, fetch, setTimeout 등
macro task queue에 할당되는 함수들
AnimationFrames(AFs)에 할당되는
requestAnimationFrame
micro task queue에 할당되는
Promise, Object.observe 등
micro > AFs > macro
비동기 함수는 web api를 통해 브라우저의 스레드에서 실행된 후
콜백 함수를 각각의 task queue로 보낸다
각 task queue에 적재된 콜백 함수들은
event loop에 의해 관리되는데,
call stack과 task queue를 계속 확인하면서
자바스크립트의 함수가 실행되는 영역인 call stack이 비어있는 경우에만
task queue의 우선순위에 맞추어 콜백 함수를 call stack으로 보내주어
실행될 수 있게 한다
call stack의 우선순위는 동기 함수 > 비동기 함수
동기 함수 > micro > AFs > macro
작업 흐름이 다른 작업의 완료를 기다림
작업 흐름이 비동기 작업의 완료를 기다리지 않고 실행됨
비동기 작업은 자신의 작업 완료 후 콜백 함수를 호출
function foo() {
console.log('foo')
}
function bar() {
console.log('bar')
}
setTimeout(foo, 0)
bar()
비동기 함수인 setTimeout 의 콜백 함수는
태스크 큐에서 대기하다가 콜 스택이 비었을 때 (전역 코드도 종료된 상태) 비로소 콜 스택에 push 되어 실행된다
자바스크립트는 싱글 스레드 방식으로 동작한다
싱글 스레드로 동작하는 것은 자바스크립트 엔진이고
브라우저는 부라우저가 아니고 브라우저 내의 자바스크립트 엔진인 것
브라우저는 멀티 스레드로 동작한다
브라우저는 자바스크립트 엔진 외에도 렌더링 엔진과
WebAPI 를 제공한다
DOM API 와 타이머 함수, HTTP 요청 같은 비동기 처리를 포함한다
setTimeout 의 경우 두 가지 기능인 타이머 설정과 타이머 만료 후 콜백 함수를 태스크 큐에 등록하는 일은 브라우저가 실행한다
따라서 병행 처리가 되는 것으로 브라우저와 자바스크립트 엔진이 협력하여 비동기 함수를 실행한다