프로미스 관련 소소한 궁금증들
1. 프로미스는 Web API 인가?
자바스크립트는 정말 싱글 스레드인가? 글을 작성하다가 이상한 이미지를 발견했다.
프로미스가 Web API 에 포함되어 있는 그림이었다. 다른 어떤 글에서도 프로미스가 Web API 에 속해있다는 내용을 본 적이 없었다. 그런데 그렇지 않다는 확신도 없었으므로, 이참에 확실히 하기 위해 찾아보았다.
결론은 프로미스는 자바스크립트의 표준 API라는 것이다. Web API 는 웹브라우저와 소통하기 위한 프로그래밍 인터페이스이므로, 프로미스는 Web API 에 속하지 않는다.
2. 마이크로태스크큐?
프로미스는 Web API 와 비슷하게 실행된다. 본문의 실행이 완료되면 완료 콜백을 메시지큐MessageQueue에 밀어넣는 방식이다. 다만 Web API 와 다른 점은 프로미스가 사용하는 메시지큐가 우리가 일반적으로 알고 있는 메시지큐가 아니라, 마이크로태스크큐MicrotaskQueue라는 별도의 큐라는 점이다.
- 메시지큐 (= 매크로태스크큐MacrotasksQueue): Web API 가 사용
- 마이크로태스크큐: 자바스크립트가 프로미스 등을 위해 사용
마이크로태스크큐는 메시지큐보다 높은 우선순위를 갖고 있다. 콜스택이 비었을 때 마이크로태스크큐와 메시지큐가 모두 태스크를 갖고 있다면 자바스크립트는 마이크로태스크큐에 있는 태스크를 먼저 가져가 실행한다.
3. 'unhandledrejection'
이벤트
프로미스에서 에러 핸들링을 하지 않았다면? (.then()
만 쓰고 .catch()
를 하지 않았다면? await
을 try
/catch
로 감싸지 않았다면?) 앱이 죽을 가능성이 높다. 웹브라우저에서는 이런 핸들링되지 않은 프로미스를 위한 전역 에러 이벤트를 제공한다. 그것이 unhandledrejection
이벤트다.
window.addEventListener("unhandledrejection", function (event) {
console.log(event.promise);
console.log(event.reason);
});
new Promise(function () {
throw new Error("TestError");
});
(HTML 표준 스펙에 포함되므로, 어느 브라우저에서든 쓸 수 있다.)
4. References
- mdn web docs - Promise
- mdn web docs - Web APIs
- Microtasks
- Error handling with promises
- 자바스크립트는 어떻게 약속을 지킬까?