Javascript-Promise

장동현·2021년 1월 23일
0

Javascript

목록 보기
1/6
post-thumbnail

Promise

비동기 작업에 대한 완료와 실패의 결과 값을 미리 설정한다.
new 생성자로 promise 객체를 설정 가능하다.

Promise의 3가지 상태


1. Peding(대기)

대기를 의미 
비동기 로직이 아직 완료되지 않은 상태
new Promise();

다음과 같이 호출하면 Peding 상태가 되고 메서드 호출 시 콜백함수를 선언 할 수 있다.
가지는 인자는 resolve reject를 가질 수 있다.

2. Fulfilled(이행) -> resolved -> .then

성공을 의미하며 .then을 사용하여 Promise가 종료 된 뒤 작업을 설정 가능하다.
비동기 로직이 완료되어 프로미스가 결과값을 반환한 상태
new Promise(function(resolve, reject) {
  resolve();
});

위와 같이 resolve 실행하면 Fulfilled 상태로 전환되며 .then()을 사용하여 결과 값 return이 가능하다.

3. Rejected(실패) -> reject -> .catch

실패를 의미하며 .catch를 사용하여 오류를 잡아낼 수 있다.
비동기 처리가 실패하거나 오류가 발생한 상태
new Promise(function(reslove, reject) {
  reject();
});

위와 같이 reject 실행하면 Rejected 상태로 전환되며 .then()을 사용하여 결과 값 return이 가능하다.

  • 많은 예외 상황 처리를 위해서는 Promise 끝 부분에 catch()를 붙이는게 좋다.

실무에서는 함수를 시작하자 마자 return을 통해 Promise를 선언하여 peding이 시작하도록 하고 Promise함수가 끝나는 부분에서 .then과 .catch를 선언하여 reslove(fulfill)과 error에 대한 정보를 담아두도록 한다고 한다.

Promise의 가장 큰 단점은 에러를 잡아낼 수 있는 타이밍과 결과에 따른 작업을 잡아내기가 힘들다는 점 이다.

function increaseAndPrint(n) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const value = n + 1;
      if (value === 5) {
        const error = new Error();
        error.name = "ValueisFiveOver";
        reject(error);
        return;
      }
      console.log(value);
      resolve(value);
    }, 1000);
  });
}

increaseAndPrint(0)
  .then(increaseAndPrint)
  .then(increaseAndPrint)
  .then(increaseAndPrint)
  .then(increaseAndPrint)
  .then(increaseAndPrint)
  .catch((e) => {
    console.log(e);
  });

위와 같이 resolove와 reject를 사용하여 5가 되면 error를 표출하는 간단한 함수가 있다.
작성자의 입장에서는 value가 5가 되는 타이밍을 알 수 있긴 하지만 코드가 길어진다면 이를 알기 힘들어지고 어느 시점에서 에러를 잡아야 할지 모르는 상황이 나오게 된다.

이를 해결하기 위해서 async await을 사용하면 된다

  • 여담으로 궁금해서 setTimeout에 resolove와 reject를 같은 시간을 주고 실행을 시켜봤는데
    그냥 먼저 실행되는 코드가 무조건 동작을 하는 것을 확인했다. 이렇게 사용하자고 만든 함수는 아니겠지만 그냥 궁금해서 해봤다.
{
  function myPromise() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('Promise 성공');
      }, 2998);
      setTimeout(() => {
        reject(new Error());
      }, 2997);
    });
  }
  myPromise()
    .then((result) => {
      console.log(result);
    })
    .catch((e) => {
      console.log(e);
    });
}
profile
FE 개발자 장동현 입니다 😃

0개의 댓글