마이크로태스크(microtask)

Vorhandenheit ·2021년 10월 7일
0

JS.코어

목록 보기
28/29
post-custom-banner

마이크로테스크

프라미스 핸들러 .then/ catch / finally 는 항상 비동기적으로 실행이됨

let promise = Promise.resolve();

promise.then(() => alert("프라미스 성공!"))
alert('코드종료'); //코드 종료가 먼저 출력

1. 마이크로테스크 큐

  • 마이크로테스크 큐는 먼저 들어온 작업을 먼저 실행(FIFO)
  • 실행할 것이 아무것도 남아있지 않을 때만 마이크로테스크 큐에 있는 작업이 실행되기 시작

어떤 프라미스가 준비되었을 때, 이 프라미스의 핸들러가 큐에 들어감, 이때는 핸들러 아직 실행되지 않음, 현재 코드에서 자유로운 상태가 되었을 때 큐에서 작업을 꺼내 실행
그래서 위에서 코드종료가 먼저 출력

프라미스 성공!을 먼저, 코드종료를 나중에 출력할려면...

Promise.resolve();
	.then(() => alert("프라미스 성공!"))
	.then(() => alert("코드 종료"));

2. 처리되지 못한 거부

'처리되지 못한 거부'는 마이크로테스크 큐 끝에서 프라미스 에러가 처리되지 못할 때 발생.

let promise = Promise.reject(new Error("프라미스 실패!"));
promise.catch(err => alert('잡았다!"));
                           
 window.addEventListner('unhandledrejection', event => alert(event.reason));

catch를 추가해주는 경우를 잊은 겅우는, 마이크로테스크 큐가 빈 이후에 unhandledrejection이벤트를 트리거함

let promise = Promise.reject(new Error('프라미스 실패!'));
window.addEvenetListner('unhadnledrejection', event => alert(event.reason));
let promise = Promise.reject(new Error('프라미스 실패!'));
	setTimeout(() => promise.catch(err => alert('잡았다!')), 1000);
//error : 프라미스 실패!
window,addEventListener('unhandledrejection', event => alert(event.reason));

프라미스 실패!가 먼저, 잡았다!가 나중에 출력됨
unhandledrejection은 마이크로 테스크 큐에 있는 작업 모두가 완료되었을 때 생성됨
엔진은 이 중 하나라도 '거부'상태면 unhandledrejection 핸들러를 트리거함

profile
읽고 기록하고 고민하고 사용하고 개발하자!
post-custom-banner

0개의 댓글