Skip to content

Instantly share code, notes, and snippets.

@ENvironmentSet
Last active May 6, 2018 15:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ENvironmentSet/d8b4b220042e4c4a0f45d45cb9a7e2e0 to your computer and use it in GitHub Desktop.
Save ENvironmentSet/d8b4b220042e4c4a0f45d45cb9a7e2e0 to your computer and use it in GitHub Desktop.
ECMA-262 8th edition의 Promise에 관한 내용들을 번역한 문서

이 번역본의 저작권은 TC39에게 있습니다.

고유명사의 경우, 대응하는 마땅한 단어가 없는 경우에는 영어 표기를 사용했습니다. 하이퍼링크의 경우 제거하였습니다. 또한 오역, 의역이 조금 있습니다. 이 부분은 양해 바랍니다.

25.4 Promise 객체

Promise는 미뤄진 계산의 결과를 나타내기위한 placeholder 로서 쓰이는 객체입니다.

모든 Promise 객체는 아래의 세 가지 상태 중 하나의 상태를 가지고 있습니다. : 이행됨(fufilled), 거절됨(rejected), 대기중(pending)

  • Promise p가 이행되었다면, p.then(f, r) 에서 함수 f를 호출하는 Job이 Job 큐에 삽입됩니다.
  • Promise p가 거절되었다면, p.then(f, r) 에서 함수 f를 호출하는 Job이 Job 큐에 삽입됩니다.
  • 만약 Promise p가 이행되지도, 거절되지도 않았다면 대기중(pending)이 됩니다.

Promise 가 대기중이 아닐 때, 즉 이행되거나 거절된 상태를 완료됨(settled)이라고 합니다.

Promise가 완료되거나, 다른 Promise를 이행하기 위해 'locked in'(절대로 이행되지 못하는 상황)이 될 때 Promise는 결정됩니다.
이런 상황에서 Promise를 해결하거나 거부하려는 시도는 아무런 효과를 일으키지 못합니다.
해결되지 않은 Promise는 해결되지 않은(unresolved) Promise라 부릅니다. 오역일 확률이 높습니다 해결되지 않은 Promise는 언제나 대기중(pending) 상태를 띕니다. 해결된 Promise는 대기중이거나 이행됨 또는 거절됨을 띄게 됩니다.

25.4.1 Promise와 관련된 추상 명령들

Abstract Operation은 추상 명령으로 번역했습니다.

25.4.1.1 PromiseCapability Records

PromiseCapability 는 Promise 객체와 그 객체를 해결(resolve)하거나 거부(reject)할 수 있는 함수들을 묶어 둔 Record 입니다.
PromiseCapability Record는 NewPromiseCapability 추상 명령에 의해 생성됩니다.

PromiseCapability Record는 Table 58에 명시된 필드들을 가지고 있습니다.

필드명 용도
[[Promise]] 객체 Promise로 사용되는 객체
[[Resolve]] 함수 객체 주어진 Promise 객체를 해결하기 위해 사용되는 함수.
[[Reject]] 함수 객체 주어진 Promise 객체를 거부하기 위해 사용되는 함수.

25.4.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise는 PromiseCapability Record를 이용하는 아래의 알고리즘을 줄여 쓴 것 입니다.

아래와 같이 생긴 코드는:

  1. IfAbruptRejectPromise(value, capability).

는 아래와 같습니다:

  1. 만약 value 가 abrupt completion 이라면,
    a. ? Call(capability.[[Reject]], undefined, « value.[[Value]] ») 를 이행한다.
    b. capability.[[Promise]]를 반환한다.
  2. 만약 value 가 Completion Record 라면, valuevalue.[[Value]]를 대입한다.

Notice « »는 list 를 뜻합니다. 예를 들어 «1, 2»는 1과 2를 요소로 가지는 길이가 2인 list 를 뜻합니다.
Notice ?는 ReturnIfAbrupt를 뜻합니다. 즉, ? 추상명령() 은 ReturnIfAbrupt(추상명령()) 과 같습니다.
Notice 이번 장에서는 자세히 언급하지는 않겠지만 Completion Record는 break, return, continue, throw 등을 표현하는 Record 입니다.

25.4.1.2 PromiseReaction Records

PromiseReaction 은 Promise가 주어진 값과 함께 해결되거나 거부되었을 때 어떻게 반응해야 하는 지에 대한 정보를 담기 위해 사용되는 Record 입니다.
PromiseReaction Record는 PreformPromiseThen 추상 명령을 통해 생성되며, PromiseReactionJob 추상 명령에 의해 사용됩니다.

PromiseReaction Record는 Table 59에 명시된 필드들을 가지고 있습니다.

필드명 용도
[[Capability]] PromiseCapability Record PromiseReaction Record가 반응 헨들러를 제공하고 있는 Promise의 PromiseCapability Record
[[Type]] "Fulfill"이나 "Reject" 중 하나 [[Handler]]가 undefined일 때 헨들링하기 위해 내부적으로 정의된 동작들을 고를 때 사용됨
[[Handler]] 함수 객체나 undefined 미래에 주어질 값을 다루는 함수이자 주어진 Promise를 다룬 값을 반환할 함수. 만약 [[Handler]]가 undefined라면 [[\Type]]의 값에 따라 내부적으로 정의된 헨들러가 사용됨.

25.4.1.3 CreateResolvingFunctions ( promise )

CreateResolvingFunctions가 인자값 promise가 주어지며 호출되었을 때, 아래의 알고리즘이 실행됩니다.

  1. alreadyResolved에 Record { [[Value]]: false }를 만들어서 대입한다.
  2. resolve25.4.1.3.2에 정의된 Promise Resolve Functions을 만들어서 대입한다.
  3. resolve.[[Promise]] 에 promise를 대입한다.
  4. resolve.[[AlreadyResolved]]에 alreadyResolved를 대입한다.
  5. reject25.4.1.3.1에 정의된 Promise Reject Functions을 만들어서 대입한다.
  6. reject.[[Promise]]에 promise를 대입한다.
  7. reject.[[AlreadyResolved]]에 alreadyResolved를 대입한다.
  8. Record { [[Resolve]]: resolve, [[Reject]]: reject }를 반환한다.

25.4.1.3.1 Promise Reject Functions

Promise reject 함수는 [[Promise]]와 [[AlreadyResolved]] 내부 슬롯을 가진 함수입니다.

Promise reject 함수 F가 인자값 reason이 주어지며 호출되었을 때, 아래의 알고리즘이 실행됩니다.

  1. 검사: F 는 값이 객체인 [[Promise]] 내부 슬롯을 가지고 있어야 한다.
  2. promiseF.[[Promise]]를 대입한다.
  3. alreadyResolvedF.[[AlreadyResolved]]를 대입한다.
  4. 만약 alreadyResolved.[[Value]] 이 true이면, undefined를 반환한다.
  5. alreadyResolved.[[Value]]에 true를 대입한다.
  6. RejectPromise(promise, reason)를 반환한다.

Promise reject 함수의 length 속성의 값은 1이다.

25.4.1.3.2 Promise Resolve Functions

Promise resolve 함수는 [[Promise]]와 [[AlreadyResolved]] 내부 슬롯을 가진 함수입니다.

Promise resolve 함수 F가 인자값 resolution이 주어지며 호출되었을 때, 아래의 알고리즘이 실행됩니다.

  1. 검사: F는 값이 객체인 [[Promise]] 내부 슬롯을 가지고 있어야 한다.
  2. promiseF.[[Promise]]를 대입한다.
  3. alreadyResolvedF.[[AlreadyResolved]]를 대입한다.
  4. 만약 alreadyResolved.[[Value]]가 true라면, undefined를 반환한다.
  5. alreadyResolved.[[Value]]에 true를 대입한다.
  6. 만약 SameValue(resolution, promise)가 true라면, a. selfResolutionErrorTypeError 객체를 만들고 대입한다. b. RejectPromise(promise, selfResolutionError)를 반환한다.
  7. 만약 Type(resolution)이 객체가 아니라면, a. FulfillPromise(promise, resolution)를 반환한다.
  8. then에 Get(resolution, "then")를 대입한다.
  9. 만약 then이 abrupt completion 이라면, a. RejectPromise(promise, then.[[Value]])를 반환한다.
  10. thenActionthen.[[Value]]를 대입한다.
  11. 만약 IsCallable(thenAction)이 false라면,
    a. FulfillPromise(promise, resolution)를 반환한다.
  12. EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise, resolution,* thenAction* »)을 이행한다.
  13. undefined를 반환한다.

Promise resolve 함수의 length 속성의 값은 1이다.

25.4.1.4 FulfillPromise ( promise, value )

FulfillPromise 추상 명령이 인자값 promisevalue가 주어지며 호출되었을 때, 아래의 알고리즘이 실행됩니다.

  1. 검사: promise.[[PromiseState]]의 값은 "pending"이여야 한다.
  2. Let reactions be promise.[[PromiseFulfillReactions]].
  3. Set promise.[[PromiseResult]] to value.
  4. Set promise.[[PromiseFulfillReactions]] to undefined.
  5. Set promise.[[PromiseRejectReactions]] to undefined.
  6. Set promise.[[PromiseState]] to "fulfilled".
  7. Return TriggerPromiseReactions(reactions, value).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment