45. 프로미스 - 후속 메서드와 정적 메서드

Sooo·2023년 9월 9일
0

(849~863)

요약

  • ECMAScript 사양에 정의된(ES6) 표준 빌트인 객체(== 네이티브 객체)
  • 프로미스 생성자는 콜백함수를 받고, 그 콜백함수는 resolve와 reject 함수를 인자로 전달받는다.
  • 비동기 처리가 성공 fullfilled하면 resolve, 실패 rejected하면 reject 함수 에 비동기 처리 결과를 인수로 넘기며 실행한다.
  • 이전까지의 비동기 처리문제(콜백 헬, 에러 처리의 어려움)을 프로미스 메서드(then, catch)의 체이닝으로 해결한다.

후속 처리 메서드 (then, catch, finally)

then

  • 두 개의 콜백 함수를 인자로 받는다: 비동기 처리가 성공fullfilled하면 실행할 resolve, 실패rejected하면 실행할 reject
  • 항상 프로미스를 반환한다
    • 콜백 함수가 프로미스를 반환하면 그대로 반환
    • 아닌 값을 반환하면 그 값을 암묵적으로 resolve/reject 해 프로미스를 생성해 반환한다

catch

  • rejected일 경우를 처리하는 콜백함수 하나를 인자로 받는다
  • then(undefined, onRejected)와 똑같이 동작
    • 단 하나의 then에서 첫번째와 두번째 콜백함수를 모두 이용해 성공/실패를 처리하면, 두 번째 콜백함수를 사용했을 때 첫번째 콜백함수에서 발생한 에러를 캐치하지 못하는 문제가 있고, 가독성이 떨어진다
    • then을 모두 호출한 후 catch(또는 에러 처리를 위한 then)을 호출하면 이전의 then 내부에서 발생한 에러까지 모두 캐치할 수 있다
    • 가독성을 위해 에러 처리할 때는 catch를 사용하기를 권장

finally

  • 프로미스의 비동기처리 성공fullfilled/실패rejected 와 상관 없이 무조건 호출됨

  • then, catch와 마찬가지로 항상 프로미스를 반환

  • 프로미스 체이닝을 이용하면 콜백 헬이 발생하지 않지만, 프로미스도 콜백 패턴을 사용하므로 콜백 함수를 사용하지 않는 것은 아니다.

    ⇒ ES8에서 도입된 async/await에서 해결

프로미스의 정적메서드 (resolve, reject, all, race, allSettled)

  • Promise.resolve / Promise.reject
  • Promise.all
    • 프로미스를 요소로 갖는 배열(이터러블)을 인수로 받고, 받은 프로미스가 모두 fullfilled가 되면 결과를 배열에 저장해 새로운 프로미스를 반환
    • Promise.all이 끝나는데 걸리는 시각은 가장 느리게 fullfilled되는 프로미스의 처리시간보다 조금 더 늦다
    • 끝나는 순서와 상관없이 배열 안의 프로미스 순서대로 결과프로미스에 담긴다 (처리 순서 보장)
      • 실제 처리 순서도 배열의 순서대로 보장된다는 뜻인가?
    • 하나라도 실패rejected하면 나머지의 처리를 기다리지 않고 즉시 종료된다
  • Promise.race
    • Promise.all과 같이 여러 프로미스를 요소로 갖는 배열(이터러블)을 인수로 받음
    • 가장 먼저 fullfilled가 된 결과를 resolve하는 프로미스 반환
    • Promise.all과 같이 ****하나라도 rejected상태가 되면 에러 reject하는 프로미스 반환
  • Promise.allSettled
    • Promise.all과 같이 여러 프로미스를 요소로 갖는 배열(이터러블)을 인수로 받음
    • 성공이던 실패던 모두 처리 후 담아서 결과 프로미스의 배열을 반환

몰랐던 것

  • 호스트 객체 / 표준 빌트인 객체?
    - 빌트인 객체: JS언어에서 지원하는 표준 객체(==네이티브 객체)
    - 호스트 객체: 브라우저나 노드와 같은 환경에서 제공하는 객체(빌트인이 아닌 모든)
    -> https://poiemaweb.com/js-built-in-object
  • then에서 아무 값도 반환 안하면 어떻게 되지? 어떤 프로미스가 반환되나
    -> undefined를 resolve한 프로미스

테스트 구현 아이디어

  • 콜백 헬 예제를 프로미스 체이닝으로 변경해보기

0개의 댓글