Promise

sungji·2024년 3월 9일
0

1. Promise란?
  • Promise 는 ES6에서 추가된 객체로 비동기처리를 위한 하나의 패턴으로 사용한다.
  • Promise 객체는 비동기처리의 상태와 결과를 관리하는 객체이다.
  • new Promise 생성자 함수로 생성하며, 인수로 전달받은 함수 (콜백함수) 를 즉시 실행한다.
  • 콜백함수는 인수로 두 개의 함수를 전달받는데, 두 개의 함수는 비동기처리의 결과로 Promise 객체의 상태를 업데이트한다.
2. reject, resolve
  • 콜백함수에 인수로 전달하는 두 개의 함수이다. 맥락에 맞는 변수명으로 변경할 수 있다.
  • 비동기처리의 결과(성공/실패)를 Promise객체에 반영하기 위해 호출한다.
  • 인수로 값을 전달해 Promise객체에 저장할 수 있다.
  • resolve : 비동기처리를 성공했을 때 호출하는 함수로, Promise객체의 status가 fulfilled로 변경된다.
  • reject : 비동기처리를 실패했을 때 호출하는 함수로, Promise객체의 status가 rejected로 변경된다.
3. then
  • Promise 객체의 status가 업데이트되면 실행되는 메서드로, 비동기 작업의 후속 처리 메서드이다.
  • then은 인수로 두 개의 함수를 전달받는데, 각각 status가 fulfilled / reject인 경우 호출되는 콜백함수이다.
  • 이 때 각각의 콜백함수는 비동기처리 결과를 인수로 받는다.
  • then 메서드는 항상 Promise 객체를 return 한다. (만약 then의 콜백함수가 어떤 값을 return하는 경우, 암묵적으로 값을 담은 Promise를 return한다.)
  • catch 메서드의 존재로 then의 인수로 한 개의 콜백함수를 전달하는 것이 가독성을 높일 수 있다.
4. catch
  • then과 마찬가지로 비동기 작업의 후속 처리 메서드이나, catch는 reject인 경우에만 호출된다.
  • 인수로 한 개의 콜백함수만 받는다.
5. finally
  • 비동
  • 기 처리의 결과 성공 여부와 무관하게, 비동기 처리 후에 수행해야 알 작업이 있는 경우 유용하다.
  • fulfilled, reject 상태에 관계없이 비동기 처리 후 무조건 한 번 호출된다.
6. 마이크로 태스크큐
  • 비동기 함수의 콜백 함수 및 이벤트 핸들러는 태스크큐에 일시적으로 저장된 후 콜 스택이 비었을 때 콜 스택으로 옮겨져 실행된다.
  • Promise의 후속 처리 메서드는 (then, catch, finally) 이와 달리 마이크로 태스크큐에 저장되어, 태스크큐 보다 높은 우선순위를 가진다.
  • 따라서 콜스택이 비면 마이크로 태스크큐 -> 태스크큐 순서로 대기하는 함수를 실행한다.
6. Method
  1. Promise.resolve() / Promise.reject()

    • 인수로 이미 존재하는 값을 전달해 Promise객체를 return 하기 위해 사용한다.
    • new Promise 생성자 함수: resolve / reject 인 상황에 대한 처리가 필요
    • Promise.resolve / Promise.reject() : 인수로 전달한 값을 바로 후속 처리 가능 (then, catch, finally)
    • 비동기 작업의 결과인 값과, 그렇지 않은 값을 함께 후속 처리해야하는 상황에서 유용하다.
  2. Promise.all()

    • 비동기 작업을 포함한 여러 개의 작업을 병렬로 처리할 때 사용
    • 모든 작업이 fulfilled 상태일 때, 순서에 따라 결과를 배열로 저장해 새로운 Promise객체를 반환한다.
    • 작업 순서가 보장되지만, 하나라도 rejected 상태인 경우, 즉시 reject함수를 호출한다. (종료된다.)
  3. Promise.allSettled()

    • all() 메서드와 유사하지만, fulfilled/rejected에 관계없이 모든 작업의 결과를 배열로 반환한다.
  4. Promise.race()

    • 여러 개의 작업 중 가장 먼저 fulfilled 되는 작업에 대해 Promise를 반환한다.
    • 가장 먼저 처리된 작업이 rejected 일 때 rejected의 결과를 반환하고 종료된다.
  5. Promise.any()

    • 여러 개의 작업 중 가장 먼저 fulfilled 되는 작업에 대해 Promise를 반환한다.
    • 처리된 작업이 rejected 일 때에도 계속 처리가 진행된다.
    • 모든 작업이 rejected 인 경우 error메세지를 리턴한다.

  • Promise 객체를 통해 비동기 작업의 상태를 관리할 수 있다.
  • resolve, reject 를 사용해 비동기 처리의 결과를 제어할 수 있다.
  • then, catch를 사용해 비동기 작업의 후속 처리와 예외 처리에 용이하다.
  • 비동기 함수의 콜백 함수와 비교해서, 더 가독성이 좋은 코드를 작성할 수 있다.

연관 주제
  • 비동기 작업
  • 콜백 함수
  • async/await
  • try/catch ...finally
  • fetch/axios

profile
열정 열정 열정

0개의 댓글