function cat() {
console.log('cat')
}
function dog() {
console.log('dog')
}
function fox() {
console.log('fox')
}
setTimeout(cat, 0)
Promise.resolve().then(dog).then(fox)
- 예제의 실행 순서: dog -> fox -> cat
- 이벤트 루프는 하나의 마이크로 태스크 큐를 가지고 있으며 태스크 큐와는 다른 태스크를 처리한다. 마이크로 태스크에는 대표적으로 Promise 가 있으며, 기존 태스크 큐보다 우선권을 가지고 있다. 마이크로 태스크 큐가 비어지기 전까지 기존의 태스크 큐의 실행은 뒤로 밀림.
# 대표적인 태스크 큐: setTimeout, setInterval, setImmediate
# 대표적인 마이크로 태스크 큐: process, nextTick, Promise, queueMicroTask, MutationObserver
- 마이크로 태스크 큐 실행 후 렌더링이 일어나며, 각 마이크로 태스크 큐 작업이 끝날 때마다 한 번씩 렌더링할 수 있다.
- sync 는 즉 100000까지 숫자가 올라가기 전까지는 렌더링이 일어나지 않다 for 문이 끝나야 렌더링.
- task 는 setTimeout 콜백이 큐에 들어가기 전까지 잠깐의 대기 시간을 갖다가 1부터 100000까지 순차적으로 렌더링.
- micro 는 100000까지 숫자가 올라간 뒤 한 번에 렌더링.
/* repaint 전 콜백 함수 호출을 가능하게 하는 requestAnimationFrame 예제 */
console.log('a')
setTimeout(()=> {
console.log('b')
}, 0)
Promise.resolve().then(()=> {
console.log('c')
})
window.requestAnimation(()=> {
console.log('d')
})
- 실행 순서: a -> c -> d -> b
- 브라우저에서 렌더링하는 작업은 마이크로 태스크 큐와 태스크 큐 사이에서 일어나며, 동기, 마이크로 태스크는 렌더링에 영향을 미침. 특정 렌더링이 JS 내 무거운 작업과 연관이 있다면 이를 어떤 식으로 분리할지 고민해야 함.
| 배열 구조 분해 할당 (0) | 2024.09.23 |
|---|---|
| 브라우저에 따른 고려사항과 compile, transpile, interpreter (0) | 2024.09.21 |
| (3) 이벤트 루프와 비동기 작업 (0) | 2024.09.20 |
| (2) 이벤트 루프 (0) | 2024.09.19 |
| (1) 싱글 스레드와 비동기 통신 (0) | 2024.09.19 |