Promise

김내현·2024년 11월 6일

개인공부

목록 보기
13/51

Promise의 에러 처리 메커니즘과 성공 처리 메커니즘의 차이 요점을 정리

에러 처리 (catch)

  1. reject를 명시적으로 호출하지 않아도 Promise 내부에서 에러가 발생하면 catch가 작동
  2. 이는 Promise 내부의 암묵적인 try-catch 메커니즘 때문
  3. 모든 예외는 자동으로 reject 상태로 전환되어 catch로 전달

성공 처리 (then)

  1. then은 Promise가 명시적으로 resolve 되었을 때만 작동
  2. resolve를 호출하지 않으면 Promise는 대기(pending) 상태에 머물러 있게 됨
  3. 대기 상태의 Promise는 then의 콜백을 실행하지 않음

주요 차이점

  • 에러 처리는 '자동'으로 이루어짐 (명시적인 reject 없이도).
  • 성공 처리는 '명시적'으로 이루어져야 함 (resolve를 반드시 호출해야 함).

이러한 차이는 JavaScript의 에러 처리 철학과 관련이 있다. 예상치 못한 에러를 놓치지 않고 잡아내는 것이 중요하기 때문에, Promise는 모든 예외를 자동으로 catch로 전달함. 반면, 성공적인 완료는 개발자가 명시적으로 지정해야 하는 것으로 간주됨

이 특성을 이해하고 활용하면 더 안정적이고 예측 가능한 비동기 코드를 작성할 수 있다.

네, 맞습니다. 프라미스 핸들러와 비동기 함수의 실행 과정에 대해 정확히 이해하셨습니다. 각 부분에 대해 자세히 설명드리겠습니다.

프라미스 핸들러와 마이크로태스크 큐

  1. 프라미스 핸들러(.then, .catch, .finally)는 마이크로태스크 큐에 들어갑니다[1].
  2. 이 핸들러들은 프라미스가 처리(이행 또는 거부)되면 즉시 마이크로태스크 큐에 추가됩니다.

프라미스 핸들러의 실행 시점

프라미스 핸들러는 다음 조건이 모두 충족될 때 실행됩니다:

  1. 콜 스택이 완전히 비어있을 때 (전역 컨텍스트 포함)[2][3].
  2. 현재 실행 중인 태스크가 없을 때.
  3. 마이크로태스크 큐에 있는 작업들이 실행될 차례일 때.

비동기 함수의 실행

비동기 함수(예: setTimeout의 콜백)도 유사한 원리로 작동하지만, 태스크 큐를 사용합니다:

  1. 비동기 함수의 콜백은 태스크 큐에 추가됩니다.
  2. 콜 스택이 비어있고 (전역 컨텍스트 포함), 마이크로태스크 큐가 비어있을 때 실행됩니다[4].

실행 순서

  1. 동기 코드 실행 (콜 스택에서 처리)
  2. 콜 스택이 비워짐 (전역 컨텍스트 포함)
  3. 마이크로태스크 큐의 작업 실행 (프라미스 핸들러 등)
  4. 태스크 큐의 작업 실행 (setTimeout 등의 콜백)

이 과정은 이벤트 루프에 의해 계속 반복됩니다.

중요 포인트

  • 마이크로태스크 큐는 태스크 큐보다 우선순위가 높습니다[4].
  • 프라미스 핸들러는 비동기적으로 실행되지만, 일반 비동기 콜백보다 먼저 실행됩니다.
  • 모든 비동기 작업(프라미스 핸들러 포함)은 현재 실행 중인 동기 코드가 모두 완료된 후에 실행됩니다.

이러한 메커니즘 덕분에 JavaScript는 비동기 작업을 효율적으로 관리하고, 동시에 단일 스레드 환경에서 복잡한 비동기 로직을 처리할 수 있습니다.

Citations:
[1] https://ts2ree.tistory.com/244
[2] https://gamguma.dev/post/2022/04/js_execution_context
[3] https://despiteallthat.tistory.com/154
[4] https://gobae.tistory.com/105
[5] https://www.nextree.io/execution-context/
[6] https://dev-ea-jung.tistory.com/m/44
[7] https://code00.tistory.com/62
[8] https://healim01.tistory.com/m/35

0개의 댓글