All files / src/chap05 wrapPromise.js

0% Statements 0/12
0% Branches 0/4
0% Functions 0/4
0% Lines 0/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34                                                                   
export default function wrapPromise(promise) {
  // Promise 상태 관리(pending, fullfilled, rejected)
  let status = 'pending';
  // Promise에서 받은 데이터
  let data;
  // 원래의 Promise에 후처리 부여
  let wrapper = promise.then(
    // 성공 시 status를 fulfilled(성공), data에 취득한 데이터를 설정한다.
    result => {
      status = 'fulfilled';
      data = result;
    },
    // 실패 시 status를 rejected(실패), data에 에러 오브젝트를 설정한다.
    e => {
      status = 'rejected';
      data = e;
    }
  );
  // 반환값은 Promise의 상태에 따라 값을 반환하는 get 메서드를 가진 객체다.
  return {
    get() {
      switch(status) {
        case 'fulfilled':
          return data;    // 성공 시 실제 데이터를 반환한다.
        case 'rejected':  
          throw data;     // 실패 시 에러 발생
        case 'pending':   
          throw wrapper;  // 완료하기 전에 Promise를 던져라.
        default:
          break;
      }
    }
  };
}