현재 실행 중인 코드가 끝난 직후, 다음 태스크로 넘어가기 전에 몰아서 처리되는 작은 작업. 이벤트 루프는 태스크 하나를 끝낼 때마다 마이크로태스크 큐가 빌 때까지 전부 실행한다.
- 들어가는 것: Promise의
then·catch·finally콜백,await다음에 이어지는 코드,queueMicrotask(),MutationObserver콜백 - 같은 태스크 안에서
setTimeout을 먼저 등록했어도 마이크로태스크가 항상 먼저 실행된다 - 처리 중에 새로 추가된 마이크로태스크도 같은 차례에 처리한다. 그래서 마이크로태스크가 자기 자신을 계속 등록하면 루프를 빠져나가지 못하고 화면이 멈춘다. 같은 재귀라도
setTimeout으로 등록하면 사이사이 렌더링이 끼어들어서 화면은 살아 있다
function loopTimeout() { setTimeout(loopTimeout) } // 느리지만 화면은 그려짐
function loopMicro() { queueMicrotask(loopMicro) } // 탭이 멈춤then 체인의 순서
체인의 다음 then은 앞 콜백이 끝나야 큐에 들어간다. 그래서 두 체인을 나란히 만들면 단계별로 번갈아 실행된다.
Promise.resolve().then(() => log('1-1')).then(() => log('1-2'))
Promise.resolve().then(() => log('2-1')).then(() => log('2-2'))
// 1-1, 2-1, 1-2, 2-2React가 일부 상태 업데이트를 모아 처리하거나(자동 배칭) 상태 관리 라이브러리가 알림을 미루는 데에도 이 "현재 코드 직후" 타이밍이 쓰인다.
참고: MDN — Using microtasks in JavaScript with queueMicrotask()