본문 바로가기
WEB/JS

(js)Promise만들기(4) - constructor, resolve, reject

by jackWillow 2024. 1. 28.

←(js)Promise만들기(3) - CustomEvent, EventTarget

 

PromiseStateEvent

 

  • PromiseState에 프로미스 상태를 표현하는 문자를 저장해 사용했습니다.
  • PromiseStateEvent는 CustomPromise에 상속할 객체로 프로미스 상태와 EventTarget을 관리하는 역할을 합니다.
    PromiseStateEvent 생성자가 호출되면 상태는 pending, eventTarget은 undefined로 초기화합니다.
    this.eventTarget = undefined로 초기화하면되는데 굳이 이런 방식을 택한것은 실제 콘솔에 Promise 인스턴스를 생성하면 [[PromiseState]], [[PromiseResult]], [[Prototype]] 만 표시되기 때문입니다.
    어떻게든 eventTarget을 표시하지 않기 위해 노력해봤지만, 이것이 제 한계였습니다.(이렇게 하면 약간 투명하게 표시됩니다.)
  • 그리고 isPending 메소드는 현재 상태가 pending인지 확인하는 메소드입니다.
    나중에 .then 메소드를 호출할 때, 앞선 프로미스가 이미 확정된 상태인지 확인하는  용도로 사용됩니다.

 

 

  • haveTarget 메소드는 eventTarget이 생성되었는지 확인하는 메소드입니다.
    연결된 프로미스(ex: nextPromise)가 있는지 확인하는 용도로 사용됩니다.
  • addSettleEventListener는 이벤트에 스위치를 저장하는 메소드입니다.
    이 때, eventTarget이 없으면 생성합니다.
  • dispatchSettleEvent는 프로미스 확정 후 상태를 저장하고 result를 이벤트에 담아서 보내는 메소드입니다.

CustomPromise constructor

 

  • CustomPromise는 Promise를 구현할 객체생성자입니다. PromiseStateEvent를 상속받았습니다.
  • result를 초기화하고 executor가 함수가 아니면 에러처리를 합니다.
  • getResolvers함수에서 resolveFunc과 rejectFunc, errorFunc을 받아서 각각 executor의 인자와 에러처리로 사용합니다.(getResolvers는 아래에 설명이 있습니다.)
  • executor는 setTimeout 0초로 이벤트 루프에 실어서 콜스택이 비었을 때 실행되도록 했습니다.

resolve & reject

 

  • getResolvers는 resolverFunc과 rejectFunc, errorFunc을 반환하는 함수입니다.
    이렇게 resolve, reject, error 함수가 getResolvers라는 함수를 통해 생성되도록 만든 이유는 프로미스가 이행되었는지를 확인하는 isResolved와 isRejected를 클로저에 담아서 반환하기 위해서 입니다.
  • isResolved와 isRejected를 false로 초기화하고 프로미스 이행 여부를 체크합니다.(하나라도 true면 이행되었음.)
  • resolveFunc은 resolve콜백으로 프로미스 이행함수 중 성공함수입니다.
    resolve콜백으로 들어오는 result(매개변수)가 프로미스면 자신과 연결하는 분기를 만듭니다.
    프로미스가 아니면 확정함수에 fulfilled 상태와 result를 담아서 호출합니다.
  • rejetFunc은 reject콜백으로 프로미스 이행함수 중 거부함수입니다.
    이상하지만, reject콜백은 result(매개변수)가 프로미스여도 구분하지 않습니다.
    확정함수에 rejected 상태와 result를 담아서 호출합니다.
    만약 연결된 다음 프로미스가 없다면 에러를 던집니다.
  • errorFunc은 executor에서 에러발생 시 처리하는 거부함수입니다.
    위 reject콜백에서 다음 프로미스가 없을 때 발생시킨 에러인 경우 그대로 _throwError함수를 통해 던집니다.
    그 외 executor에서 발생시킨 에러인 경우 확정함수에 rejected 상태와 error값을 담아 호출합니다.
    그 후 다음 프로미스가 없는 경우 에러를 던집니다.

 

 

  • settle은 프로미스 확정함수로 결과값을 저장하고, 상태저장과 이벤트를 보내는 dispatchSettleEvent에 상태와 결과값을 담아서 호출합니다.
  • _throwError는 에러를 던지는 함수입니다.

 

→(js)Promise만들기(5) - then, catch

 

반응형