27 제어 추상화 객체 (Control Abstraction Objects)

27.1 반복 (Iteration)

27.1.1 공통 반복 인터페이스 (Common Iteration Interfaces)

인터페이스는 특정 명세를 만족하는 값들을 갖는 프로퍼티 키들의 집합이다. 어떤 객체가 한 인터페이스 명세에 기술된 모든 프로퍼티를 제공하면 그 객체는 그 인터페이스를 준수(conform)한다고 한다. 인터페이스 자체가 별도의 객체로 표현되지는 않는다. 하나의 인터페이스를 준수하는 개별적으로 구현된 객체는 여럿 있을 수 있다. 하나의 객체가 여러 인터페이스를 동시에 준수할 수도 있다.

27.1.1.1 Iterable 인터페이스 (The Iterable Interface)

iterable 인터페이스Table 80에 기술된 프로퍼티를 포함한다:

Table 80: Iterable 인터페이스 필수 프로퍼티 (Iterable Interface Required Properties)
프로퍼티 (Property) 값 (Value) 요구사항 (Requirements)
%Symbol.iterator% 이터레이터 객체를 반환하는 함수 반환된 객체는 iterator 인터페이스를 준수해야 한다.

27.1.1.2 Iterator 인터페이스 (The Iterator Interface)

iterator 인터페이스를 구현하는 객체는 Table 81의 프로퍼티를 포함해야 한다. 그러한 객체는 Table 82의 프로퍼티를 추가로 구현할 수도 있다.

Table 81: Iterator 인터페이스 필수 프로퍼티 (Iterator Interface Required Properties)
프로퍼티 요구사항
"next" IteratorResult 객체를 반환하는 함수 반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 어떤 이터레이터의 next 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체를 반환했다면, 그 객체에 대한 이후의 모든 next 호출도 "done" 프로퍼티가 true인 IteratorResult 객체를 반환해야 한다. 그러나 이 요구사항은 강제되지 않는다.
Note 1

next 함수에 인수를 전달할 수 있지만, 그것들의 해석 및 유효성은 대상 이터레이터에 의존한다. for-of 문 및 기타 일반적인 이터레이터 소비자는 어떤 인수도 전달하지 않으므로, 그러한 방식으로 사용될 것을 기대하는 이터레이터 객체는 인수 없이 호출되는 상황을 처리할 준비가 되어 있어야 한다.

Table 82: Iterator 인터페이스 선택적 프로퍼티 (Iterator Interface Optional Properties)
프로퍼티 요구사항
"return" IteratorResult 객체를 반환하는 함수 반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 이 메서드를 호출하면 호출자가 더 이상 이터레이터의 next 메서드를 호출할 의도가 없음을 이터레이터 객체에 알린다. 반환된 IteratorResult 객체는 대개 "done" 프로퍼티 값이 true이고, return 메서드의 인수로 전달된 값을 가진 "value" 프로퍼티를 가진다. 그러나 이 요구사항은 강제되지 않는다.
"throw" IteratorResult 객체를 반환하는 함수 반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 이 메서드를 호출하면 호출자가 에러 상태를 감지했음을 이터레이터 객체에 알린다. 인수는 에러 상태를 식별하는 데 사용될 수 있고 일반적으로 예외 객체일 것이다. 일반적인 반응은 인수로 전달된 값을 throw하는 것이다. 메서드가 throw하지 않는 경우, 반환된 IteratorResult 객체는 대개 "done" 프로퍼티 값이 true이다.
Note 2

보통 이러한 메서드의 호출자는 호출 전에 그 존재를 확인해야 한다. for-of, yield*, 배열 구조 분해 등을 포함한 특정 ECMAScript 언어 기능은 존재 여부를 확인한 후 이들 메서드를 호출한다. 이터러블 객체를 인수로 받는 대부분의 ECMAScript 라이브러리 함수도 조건부로 이들을 호출한다.

27.1.1.3 Async Iterable 인터페이스 (The Async Iterable Interface)

async iterable 인터페이스Table 83에 기술된 프로퍼티를 포함한다:

Table 83: Async Iterable 인터페이스 필수 프로퍼티 (Async Iterable Interface Required Properties)
프로퍼티 요구사항
%Symbol.asyncIterator% async 이터레이터 객체를 반환하는 함수 반환된 객체는 async iterator 인터페이스를 준수해야 한다.

27.1.1.4 Async Iterator 인터페이스 (The Async Iterator Interface)

async iterator 인터페이스를 구현하는 객체는 Table 84의 프로퍼티를 포함해야 한다. 그러한 객체는 Table 85의 프로퍼티를 추가로 구현할 수도 있다.

Table 84: Async Iterator 인터페이스 필수 프로퍼티 (Async Iterator Interface Required Properties)
프로퍼티 요구사항
"next" IteratorResult 객체에 대한 promise 를 반환하는 함수

반환된 promise가 이행(fulfill)될 때, IteratorResult 인터페이스를 준수하는 객체로 이행해야 한다. 어떤 async iteratornext 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체에 대한 promise를 반환했다면, 그 객체의 이후 모든 next 호출 역시 "done" 프로퍼티가 true인 IteratorResult 객체에 대한 promise를 반환해야 한다. 그러나 이 요구사항은 강제되지 않는다.

추가로, 이행 값으로 사용되는 IteratorResult 객체는 promise(또는 "thenable")가 아닌 값을 가진 "value" 프로퍼티를 가져야 한다. 하지만 이 요구사항 또한 강제되지 않는다.

Note 1

next 함수에 인수를 전달할 수 있지만, 그것들의 해석 및 유효성은 대상 async iterator에 의존한다. for-await-of 문 및 기타 일반적인 async iterator 소비자는 인수를 전달하지 않으므로, 그러한 방식으로 사용될 것을 기대하는 async iterator 객체는 인수 없이 호출되는 상황을 처리할 준비가 되어 있어야 한다.

Table 85: Async Iterator 인터페이스 선택적 프로퍼티 (Async Iterator Interface Optional Properties)
프로퍼티 요구사항
"return" IteratorResult 객체에 대한 promise 를 반환하는 함수

반환된 promise가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행해야 한다. 이 메서드를 호출하면 호출자가 async iteratornext 메서드를 더 이상 호출할 의도가 없음을 async iterator 객체에 알린다. 반환되는 promise는 대개 "done" 프로퍼티 값이 true이고, return 메서드의 인수로 전달된 값을 가진 "value" 프로퍼티가 있는 IteratorResult 객체로 이행된다. 그러나 이 요구사항은 강제되지 않는다.

추가로, 이행 값으로 사용되는 IteratorResult 객체는 promise(또는 "thenable")가 아닌 값을 가진 "value" 프로퍼티를 가져야 한다. 인수 값이 일반적인 방식으로 사용되는 경우, 만약 그것이 거부된(rejected) promise라면 동일한 reason으로 거부된 promise가 반환되어야 하고, 이행된(fulfilled) promise라면 그 이행 값을 반환 promise의 IteratorResult 객체 이행 값의 "value" 프로퍼티로 사용해야 한다. 그러나 이러한 요구사항들도 강제되지 않는다.

"throw" IteratorResult 객체에 대한 promise 를 반환하는 함수

반환된 promise가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행해야 한다. 이 메서드를 호출하면 호출자가 에러 상태를 감지했음을 async iterator 객체에 알린다. 인수는 에러 상태를 식별하는 데 사용될 수 있으며 일반적으로 예외 객체일 것이다. 전형적인 반응은 인수로 전달된 값으로 거부되는(rejected) promise를 반환하는 것이다.

반환된 promise가 이행되는 경우, IteratorResult 객체 이행 값은 보통 "done" 프로퍼티 값이 true이다. 또한 "value" 프로퍼티는 promise(또는 "thenable")가 아닌 값을 가져야 하지만, 이 요구사항은 강제되지 않는다.

Note 2

일반적으로 이러한 메서드의 호출자는 호출 전에 그 존재를 확인해야 한다. for-await-ofyield* 등을 포함한 특정 ECMAScript 언어 기능은 존재 여부를 확인한 뒤 이들 메서드를 호출한다.

27.1.1.5 IteratorResult 인터페이스 (The IteratorResult Interface)

IteratorResult 인터페이스Table 86에 열거된 프로퍼티를 포함한다:

Table 86: IteratorResult 인터페이스 프로퍼티 (IteratorResult Interface Properties)
프로퍼티 요구사항
"done" Boolean 이는 이터레이터 next 메서드 호출의 결과 상태이다. 이터레이터의 끝에 도달했다면 "done"true이다. 끝에 도달하지 않았다면 "done"false이며 값이 존재한다. "done" 프로퍼티(소유 또는 상속)가 존재하지 않는다면 그 값은 false로 간주한다.
"value" ECMAScript 언어 값 done 이 false이면, 이는 현재 반복 요소 값이다. done 이 true이면, 이는 이터레이터가 제공했다면 그 반환 값이다. 이터레이터에 반환 값이 없다면 "value"undefined이다. 그 경우, 객체가 명시적 "value" 프로퍼티를 상속하지 않는다면 "value" 프로퍼티는 준수 객체에서 생략될 수 있다.

27.1.2 Iterator Helper 객체 (Iterator Helper Objects)

Iterator Helper 객체는 특정 소스 이터레이터 객체의 지연(lazy) 변환을 표현하는 일반 객체이다. Iterator Helper 객체에 대한 명명된 생성자는 없다. 대신, Iterator Helper 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성된다.

27.1.2.1 %IteratorHelperPrototype% 객체 (The %IteratorHelperPrototype% Object)

%IteratorHelperPrototype% 객체:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. GeneratorResume(this value, undefined, "Iterator Helper")를 반환한다.

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. Othis 값으로 둔다.
  2. RequireInternalSlot(O, [[UnderlyingIterator]])를 수행한다.
  3. O[[GeneratorState]] 내부 슬롯을 가지고 있음을 단언(Assert)한다.
  4. O.[[GeneratorState]]suspended-start 이면,
    1. O.[[GeneratorState]]completed 로 설정한다.
    2. 주: 한 번 generator가 completed 상태에 들어가면 다시 나오지 않고 그 연관 실행 컨텍스트는 재개되지 않는다. O 와 연관된 어떤 실행 상태도 이 시점에서 폐기될 수 있다.
    3. IteratorClose(O.[[UnderlyingIterator]], NormalCompletion(unused))를 수행한다.
    4. CreateIteratorResultObject(undefined, true)를 반환한다.
  5. CReturnCompletion(undefined)로 둔다.
  6. GeneratorResumeAbrupt(O, C, "Iterator Helper")를 반환한다.

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "Iterator Helper" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.1.3 Iterator 객체 (Iterator Objects)

27.1.3.1 Iterator 생성자 (The Iterator Constructor)

Iterator 생성자:

  • %Iterator% 이다.
  • 전역 객체"Iterator" 프로퍼티의 초기 값이다.
  • 서브클래싱 가능하도록 설계되었다. 클래스 정의의 extends 절 값으로 사용할 수 있다.

27.1.3.1.1 Iterator ( )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 이거나 활성 함수 객체라면 TypeError 예외를 던진다.
  2. OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%")를 반환한다.

27.1.3.2 Iterator 생성자의 프로퍼티 (Properties of the Iterator Constructor)

Iterator 생성자:

  • [[Prototype]] 내부 슬롯 값이 %Function.prototype%이다.
  • 다음 프로퍼티들을 가진다:

27.1.3.2.1 Iterator.from ( O )

  1. iteratorRecord 를 ? GetIteratorFlattenable(O, iterate-string-primitives)로 둔다.
  2. hasInstance 를 ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]])로 둔다.
  3. hasInstancetrue 이면,
    1. iteratorRecord.[[Iterator]] 를 반환한다.
  4. wrapperOrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] »)로 둔다.
  5. wrapper.[[Iterated]]iteratorRecord 로 설정한다.
  6. wrapper 를 반환한다.

27.1.3.2.1.1 %WrapForValidIteratorPrototype% 객체 (The %WrapForValidIteratorPrototype% Object)

%WrapForValidIteratorPrototype% 객체:

27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. Othis 값으로 둔다.
  2. RequireInternalSlot(O, [[Iterated]])를 수행한다.
  3. iteratorRecordO.[[Iterated]] 로 둔다.
  4. Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])를 반환한다.

27.1.3.2.1.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. Othis 값으로 둔다.
  2. RequireInternalSlot(O, [[Iterated]])를 수행한다.
  3. iteratorO.[[Iterated]].[[Iterator]] 로 둔다.
  4. iterator 가 Object 임을 단언한다.
  5. returnMethod 를 ? GetMethod(iterator, "return")로 둔다.
  6. returnMethodundefined 이면
    1. CreateIteratorResultObject(undefined, true)를 반환한다.
  7. Call(returnMethod, iterator)를 반환한다.

27.1.3.2.2 Iterator.prototype

Iterator.prototype의 초기 값은 Iterator 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

27.1.4 Iterator 프로토타입 객체의 프로퍼티 (Properties of the Iterator Prototype Object)

Iterator 프로토타입 객체:

Note

이 명세에서 iterator 인터페이스를 구현하는 모든 객체는 %Iterator.prototype%을 상속한다. ECMAScript 코드는 또한 %Iterator.prototype%을 상속하는 객체를 정의할 수 있다. %Iterator.prototype%은 모든 iterator 객체에 적용 가능한 추가 메서드를 추가할 수 있는 장소를 제공한다.

다음 식은 ECMAScript 코드가 %Iterator.prototype% 객체에 접근할 수 있는 한 가지 방법이다:

Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))

27.1.4.1 Iterator.prototype.constructor

Iterator.prototype.constructor 는 { [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진 접근자 프로퍼티이다. [[Get]][[Set]] 특성은 다음과 같이 정의된다:

27.1.4.1.1 get Iterator.prototype.constructor

[[Get]] 특성의 값은 인수가 필요 없는 내장 함수이다. 호출 시 다음 단계를 수행한다:

  1. %Iterator% 를 반환한다.

27.1.4.1.2 set Iterator.prototype.constructor

[[Set]] 특성의 값은 인수 v 를 받는 내장 함수이다. 호출 시 다음 단계를 수행한다:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, "constructor", v)를 수행한다.
  2. undefined 를 반환한다.
Note

대부분의 내장 프로토타입에 있는 "constructor" 프로퍼티와 달리, 웹 호환성 이유로 이 프로퍼티는 접근자여야 한다.

27.1.4.2 Iterator.prototype.drop ( limit )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. numLimitCompletion(ToNumber(limit))로 둔다.
  5. IfAbruptCloseIterator(numLimit, iterated).
  6. numLimitNaN 이면,
    1. errorThrowCompletion(새로 생성된 RangeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  7. integerLimit 를 ! ToIntegerOrInfinity(numLimit)로 둔다.
  8. integerLimit < 0 이면,
    1. errorThrowCompletion(새로 생성된 RangeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  9. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  10. closureiteratedintegerLimit 를 포획(capture)하는 매개변수 없는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
    1. remainingintegerLimit 로 둔다.
    2. remaining > 0 인 동안 반복,
      1. remaining ≠ +∞ 이면,
        1. remainingremaining - 1 로 설정한다.
      2. next 를 ? IteratorStep(iterated)로 둔다.
      3. nextdone 이면, ReturnCompletion(undefined)를 반환한다.
    3. 반복,
      1. value 를 ? IteratorStepValue(iterated)로 둔다.
      2. valuedone 이면, ReturnCompletion(undefined)를 반환한다.
      3. completionCompletion(Yield(value))로 둔다.
      4. IfAbruptCloseIterator(completion, iterated).
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둔다.
  12. result.[[UnderlyingIterator]]iterated 로 설정한다.
  13. result 를 반환한다.

27.1.4.3 Iterator.prototype.every ( predicate )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(predicate) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. counter 를 0 으로 둔다.
  7. 반복,
    1. value 를 ? IteratorStepValue(iterated)로 둔다.
    2. valuedone 이면 true 를 반환한다.
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둔다.
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result) 가 false 이면, ? IteratorClose(iterated, NormalCompletion(false))를 반환한다.
    6. countercounter + 1 로 설정한다.

27.1.4.4 Iterator.prototype.filter ( predicate )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(predicate) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. closureiteratedpredicate 를 포획하는 매개변수 없는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
    1. counter 를 0 으로 둔다.
    2. 반복,
      1. value 를 ? IteratorStepValue(iterated)로 둔다.
      2. valuedone 이면 ReturnCompletion(undefined)를 반환한다.
      3. selectedCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둔다.
      4. IfAbruptCloseIterator(selected, iterated).
      5. ToBoolean(selected) 가 true 이면,
        1. completionCompletion(Yield(value))로 둔다.
        2. IfAbruptCloseIterator(completion, iterated).
      6. countercounter + 1 로 설정한다.
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둔다.
  8. result.[[UnderlyingIterator]]iterated 로 설정한다.
  9. result 를 반환한다.

27.1.4.5 Iterator.prototype.find ( predicate )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(predicate) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. counter 를 0 으로 둔다.
  7. 반복,
    1. value 를 ? IteratorStepValue(iterated)로 둔다.
    2. valuedone 이면 undefined 를 반환한다.
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둔다.
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result) 가 true 이면, ? IteratorClose(iterated, NormalCompletion(value))를 반환한다.
    6. countercounter + 1 로 설정한다.

27.1.4.6 Iterator.prototype.flatMap ( mapper )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(mapper) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. closureiteratedmapper 를 포획하는 매개변수 없는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
    1. counter 를 0 으로 둔다.
    2. 반복,
      1. value 를 ? IteratorStepValue(iterated)로 둔다.
      2. valuedone 이면 ReturnCompletion(undefined)를 반환한다.
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »))로 둔다.
      4. IfAbruptCloseIterator(mapped, iterated).
      5. innerIteratorCompletion(GetIteratorFlattenable(mapped, reject-primitives))로 둔다.
      6. IfAbruptCloseIterator(innerIterator, iterated).
      7. innerAlivetrue 로 둔다.
      8. innerAlivetrue 인 동안 반복,
        1. innerValueCompletion(IteratorStepValue(innerIterator))로 둔다.
        2. IfAbruptCloseIterator(innerValue, iterated).
        3. innerValuedone 이면,
          1. innerAlivefalse 로 설정한다.
        4. 그렇지 않으면,
          1. completionCompletion(Yield(innerValue))로 둔다.
          2. completionabrupt completion 이면,
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion))로 둔다.
            2. IfAbruptCloseIterator(backupCompletion, iterated).
            3. IteratorClose(iterated, completion)를 반환한다.
      9. countercounter + 1 로 설정한다.
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둔다.
  8. result.[[UnderlyingIterator]]iterated 로 설정한다.
  9. result 를 반환한다.

27.1.4.7 Iterator.prototype.forEach ( procedure )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(procedure) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. counter 를 0 으로 둔다.
  7. 반복,
    1. value 를 ? IteratorStepValue(iterated)로 둔다.
    2. valuedone 이면 undefined 를 반환한다.
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »))로 둔다.
    4. IfAbruptCloseIterator(result, iterated).
    5. countercounter + 1 로 설정한다.

27.1.4.8 Iterator.prototype.map ( mapper )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(mapper) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. closureiteratedmapper 를 포획하는 매개변수 없는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
    1. counter 를 0 으로 둔다.
    2. 반복,
      1. value 를 ? IteratorStepValue(iterated)로 둔다.
      2. valuedone 이면 ReturnCompletion(undefined)를 반환한다.
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »))로 둔다.
      4. IfAbruptCloseIterator(mapped, iterated).
      5. completionCompletion(Yield(mapped))로 둔다.
      6. IfAbruptCloseIterator(completion, iterated).
      7. countercounter + 1 로 설정한다.
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둔다.
  8. result.[[UnderlyingIterator]]iterated 로 설정한다.
  9. result 를 반환한다.

27.1.4.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(reducer) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. initialValue 가 존재하지 않으면,
    1. accumulator 를 ? IteratorStepValue(iterated)로 둔다.
    2. accumulatordone 이면 TypeError 예외를 던진다.
    3. counter 를 1 로 둔다.
  7. 그렇지 않으면,
    1. accumulatorinitialValue 로 둔다.
    2. counter 를 0 으로 둔다.
  8. 반복,
    1. value 를 ? IteratorStepValue(iterated)로 둔다.
    2. valuedone 이면 accumulator 를 반환한다.
    3. resultCompletion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »))로 둔다.
    4. IfAbruptCloseIterator(result, iterated).
    5. accumulatorresult 로 설정한다.
    6. countercounter + 1 로 설정한다.

27.1.4.10 Iterator.prototype.some ( predicate )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. IsCallable(predicate) 가 false 이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  6. counter 를 0 으로 둔다.
  7. 반복,
    1. value 를 ? IteratorStepValue(iterated)로 둔다.
    2. valuedone 이면 false 를 반환한다.
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둔다.
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result) 가 true 이면, ? IteratorClose(iterated, NormalCompletion(true))를 반환한다.
    6. countercounter + 1 로 설정한다.

27.1.4.11 Iterator.prototype.take ( limit )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } 로 둔다.
  4. numLimitCompletion(ToNumber(limit))로 둔다.
  5. IfAbruptCloseIterator(numLimit, iterated).
  6. numLimitNaN 이면,
    1. errorThrowCompletion(새로 생성된 RangeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  7. integerLimit 를 ! ToIntegerOrInfinity(numLimit)로 둔다.
  8. integerLimit < 0 이면,
    1. errorThrowCompletion(새로 생성된 RangeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  9. iterated 를 ? GetIteratorDirect(O)로 설정한다.
  10. closureiteratedintegerLimit 를 포획하는 매개변수 없는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
    1. remainingintegerLimit 로 둔다.
    2. 반복,
      1. remaining = 0 이면,
        1. IteratorClose(iterated, ReturnCompletion(undefined))를 반환한다.
      2. remaining ≠ +∞ 이면,
        1. remainingremaining - 1 로 설정한다.
      3. value 를 ? IteratorStepValue(iterated)로 둔다.
      4. valuedone 이면 ReturnCompletion(undefined)를 반환한다.
      5. completionCompletion(Yield(value))로 둔다.
      6. IfAbruptCloseIterator(completion, iterated).
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둔다.
  12. result.[[UnderlyingIterator]]iterated 로 설정한다.
  13. result 를 반환한다.

27.1.4.12 Iterator.prototype.toArray ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 둔다.
  2. O 가 Object 가 아니면 TypeError 예외를 던진다.
  3. iterated 를 ? GetIteratorDirect(O)로 둔다.
  4. items 를 새로운 빈 List 로 둔다.
  5. 반복,
    1. value 를 ? IteratorStepValue(iterated)로 둔다.
    2. valuedone 이면 CreateArrayFromList(items)를 반환한다.
    3. valueitems 에 추가한다.

27.1.4.13 Iterator.prototype [ %Symbol.iterator% ] ( )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. this 값을 반환한다.

이 함수의 "name" 프로퍼티 값은 "[Symbol.iterator]" 이다.

27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%] 는 { [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진 접근자 프로퍼티이다. [[Get]][[Set]] 특성은 다음과 같이 정의된다:

27.1.4.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]

[[Get]] 특성의 값은 인수가 필요 없는 내장 함수이다. 호출 시 다음 단계를 수행한다:

  1. "Iterator" 를 반환한다.

27.1.4.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]

[[Set]] 특성의 값은 인수 v 를 받는 내장 함수이다. 호출 시 다음 단계를 수행한다:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, %Symbol.toStringTag%, v)를 수행한다.
  2. undefined 를 반환한다.
Note

대부분의 내장 프로토타입에 있는 %Symbol.toStringTag% 프로퍼티와 달리, 웹 호환성 이유로 이 프로퍼티는 접근자여야 한다.

27.1.5 %AsyncIteratorPrototype% 객체 (The %AsyncIteratorPrototype% Object)

%AsyncIteratorPrototype% 객체:

Note

이 명세에서 async iterator 인터페이스를 구현하는 모든 객체는 %AsyncIteratorPrototype%을 상속한다. ECMAScript 코드는 또한 %AsyncIteratorPrototype%을 상속하는 객체를 정의할 수 있다. %AsyncIteratorPrototype% 객체는 모든 async iterator 객체에 적용 가능한 추가 메서드를 추가할 수 있는 장소를 제공한다.

27.1.5.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. this 값을 반환한다.

이 함수의 "name" 프로퍼티 값은 "[Symbol.asyncIterator]" 이다.

27.1.6 Sync 이터레이터 기반 Async 이터레이터 객체 (Async-from-Sync Iterator Objects)

Async-from-Sync Iterator 객체는 특정 동기(synchronous) 이터레이터를 적응(adapt)한 async 이터레이터이다. Async-from-Sync Iterator 객체는 ECMAScript 코드에서 직접 접근할 수 없다. Async-from-Sync Iterator 객체에 대한 명명된 생성자는 없다. 대신, 필요할 때 CreateAsyncFromSyncIterator 추상 연산에 의해 생성된다.

27.1.6.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an Iterator Record) and returns an Iterator Record. 동기 Iterator Record 로부터 async Iterator Record 를 생성하는 데 사용된다. It performs the following steps when called:

  1. asyncIteratorOrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] »)로 둔다.
  2. asyncIterator.[[SyncIteratorRecord]]syncIteratorRecord 로 설정한다.
  3. nextMethod 를 ! Get(asyncIterator, "next")로 둔다.
  4. iteratorRecordIterator Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } 로 둔다.
  5. iteratorRecord 를 반환한다.

27.1.6.2 %AsyncFromSyncIteratorPrototype% 객체 (The %AsyncFromSyncIteratorPrototype% Object)

%AsyncFromSyncIteratorPrototype% 객체:

27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. Othis 값으로 둔다.
  2. O[[SyncIteratorRecord]] 내부 슬롯을 가진 Object 임을 단언한다.
  3. promiseCapability 를 ! NewPromiseCapability(%Promise%)로 둔다.
  4. syncIteratorRecordO.[[SyncIteratorRecord]] 로 둔다.
  5. value 가 존재하면,
    1. resultCompletion(IteratorNext(syncIteratorRecord, value))로 둔다.
  6. 그렇지 않으면,
    1. resultCompletion(IteratorNext(syncIteratorRecord))로 둔다.
  7. IfAbruptRejectPromise(result, promiseCapability).
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)를 반환한다.

27.1.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. Othis 값으로 둔다.
  2. O[[SyncIteratorRecord]] 내부 슬롯을 가진 Object 임을 단언한다.
  3. promiseCapability 를 ! NewPromiseCapability(%Promise%)로 둔다.
  4. syncIteratorRecordO.[[SyncIteratorRecord]] 로 둔다.
  5. syncIteratorsyncIteratorRecord.[[Iterator]] 로 둔다.
  6. returnCompletion(GetMethod(syncIterator, "return" ))로 둔다.
  7. IfAbruptRejectPromise(return, promiseCapability).
  8. returnundefined 이면,
    1. iteratorResultCreateIteratorResultObject(value, true)로 둔다.
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행한다.
    3. promiseCapability.[[Promise]] 를 반환한다.
  9. value 가 존재하면,
    1. resultCompletion(Call(return, syncIterator, « value »))로 둔다.
  10. 그렇지 않으면,
    1. resultCompletion(Call(return, syncIterator))로 둔다.
  11. IfAbruptRejectPromise(result, promiseCapability).
  12. result 가 Object 가 아니면,
    1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
    2. promiseCapability.[[Promise]] 를 반환한다.
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false)를 반환한다.

27.1.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
이 명세에서 value 는 항상 제공되지만, %AsyncFromSyncIteratorPrototype%.return ( [ value ] )과의 일관성을 위해 선택적으로 남겨 둔다.
  1. Othis 값으로 둔다.
  2. O[[SyncIteratorRecord]] 내부 슬롯을 가진 Object 임을 단언한다.
  3. promiseCapability 를 ! NewPromiseCapability(%Promise%)로 둔다.
  4. syncIteratorRecordO.[[SyncIteratorRecord]] 로 둔다.
  5. syncIteratorsyncIteratorRecord.[[Iterator]] 로 둔다.
  6. throwCompletion(GetMethod(syncIterator, "throw" ))로 둔다.
  7. IfAbruptRejectPromise(throw, promiseCapability).
  8. throwundefined 이면,
    1. 주: syncIteratorthrow 메서드가 없다면, capability 거부 전에 정리할 기회를 주기 위해 그것을 닫는다.
    2. closeCompletionNormalCompletion(empty)로 둔다.
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion))로 둔다.
    4. IfAbruptRejectPromise(result, promiseCapability).
    5. 주: 다음 단계는 프로토콜 위반(syncIteratorthrow 메서드가 없음)을 나타내기 위해 TypeError 를 던진다.
    6. 주: syncIterator 를 닫는 것이 throw 하지 않으면 그 연산 결과는, 거부된 promise 를 산출한다 해도, 무시된다.
    7. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
    8. promiseCapability.[[Promise]] 를 반환한다.
  9. value 가 존재하면,
    1. resultCompletion(Call(throw, syncIterator, « value »))로 둔다.
  10. 그렇지 않으면,
    1. resultCompletion(Call(throw, syncIterator))로 둔다.
  11. IfAbruptRejectPromise(result, promiseCapability).
  12. result 가 Object 가 아니면,
    1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
    2. promiseCapability.[[Promise]] 를 반환한다.
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)를 반환한다.

27.1.6.3 Async-from-Sync Iterator 인스턴스의 프로퍼티 (Properties of Async-from-Sync Iterator Instances)

Async-from-Sync Iterator 인스턴스는 %AsyncFromSyncIteratorPrototype% 내재 객체를 상속하는 일반 객체이다. Async-from-Sync Iterator 인스턴스는 Table 87에 열거된 내부 슬롯을 가지고 초기화된다.

Table 87: Async-from-Sync Iterator 인스턴스의 내부 슬롯 (Internal Slots of Async-from-Sync Iterator Instances)
내부 슬롯 (Internal Slot) 타입 (Type) 설명 (Description)
[[SyncIteratorRecord]] Iterator Record 적응되고 있는 원래의 동기 이터레이터를 나타낸다.

27.1.6.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (an Object), promiseCapability (a PromiseCapability Record for an intrinsic %Promise%), syncIteratorRecord (an Iterator Record), and closeOnRejection (a Boolean) and returns a Promise. It performs the following steps when called:

  1. 주: promiseCapability 가 내재 %Promise% 로부터 유도되었으므로, 이후 IfAbruptRejectPromise 사용이 수반하는 promiseCapability.[[Reject]] 호출은 throw 하지 않는 것이 보장된다.
  2. doneCompletion(IteratorComplete(result))로 둔다.
  3. IfAbruptRejectPromise(done, promiseCapability).
  4. valueCompletion(IteratorValue(result))로 둔다.
  5. IfAbruptRejectPromise(value, promiseCapability).
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value))로 둔다.
  7. valueWrapperabrupt completion 이고, donefalse 이며, closeOnRejectiontrue 이면
    1. valueWrapperCompletion(IteratorClose(syncIteratorRecord, valueWrapper))로 설정한다.
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability).
  9. unwrap 을 매개변수 (v) 를 가지고 done 을 포획하는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
    1. CreateIteratorResultObject(v, done)를 반환한다.
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « »)로 둔다.
  11. 주: onFulfilled 는 IteratorResult 객체의 "value" 프로퍼티를 처리할 때 그 값이 promise 인 경우 이를 대기하고 새 "언랩된" IteratorResult 객체로 재포장하기 위해 사용된다.
  12. donetrue 이거나 closeOnRejectionfalse 이면,
    1. onRejectedundefined 로 둔다.
  13. 그렇지 않으면,
    1. closeIterator 를 매개변수 (error) 를 가지고 syncIteratorRecord 를 포획하는 새로운 Abstract Closure 로 두고, 호출 시 다음 단계를 수행하게 한다:
      1. IteratorClose(syncIteratorRecord, ThrowCompletion(error))를 반환한다.
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « »)로 둔다.
    3. 주: onRejected 는 IteratorResult 객체가 내놓는 "value" 프로퍼티가 거부된 promise 인 경우 이터레이터를 닫는 데 사용된다.
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)를 수행한다.
  15. promiseCapability.[[Promise]] 를 반환한다.

27.2 Promise Objects

Promise 는 지연(그리고 비동기일 수도 있는) 계산의 최종 결과에 대한 자리표시자로 사용되는 객체이다.

모든 Promise 는 상호 배타적인 세 가지 상태 중 하나이다: fulfilled, rejected, pending:

  • Promise pp.then(f, r) 이 즉시 함수 f 를 호출하는 Job 을 큐잉(enqueue)하면 fulfilled 상태이다.
  • Promise pp.then(f, r) 이 즉시 함수 r 를 호출하는 Job 을 큐잉하면 rejected 상태이다.
  • Promise 가 fulfilled 도 rejected 도 아니면 pending 상태이다.

Promise 가 pending 이 아니면, 즉 fulfilled 이거나 rejected 이면 settled 되었다고 말한다.

Promise 가 settled 이거나 다른 promise 의 상태에 “고정(lock in)” 되었으면 resolved 되었다고 한다. 이미 resolved 된 promise 를 resolve 또는 reject 하려는 시도는 아무 효과가 없다. Promise 가 resolved 가 아니면 unresolved 이다. Unresolved promise 는 항상 pending 상태이다. Resolved promise 는 pending, fulfilled 또는 rejected 일 수 있다.

27.2.1 Promise 추상 연산 (Promise Abstract Operations)

27.2.1.1 PromiseCapability Records

PromiseCapability Record 는 특정 Promise 또는 Promise 유사 객체와 그것을 resolve 또는 reject 할 수 있는 함수들을 함께 캡슐화하기 위해 사용되는 Record 값이다. PromiseCapability Record 는 NewPromiseCapability 추상 연산에 의해 생성된다.

PromiseCapability Record 는 Table 88에 열거된 필드를 가진다.

Table 88: PromiseCapability Record Fields (PromiseCapability 레코드 필드)
Field Name Value Meaning
[[Promise]] an Object Promise 로 사용할 수 있는 객체.
[[Resolve]] a function object 해당 promise 를 resolve 하는 데 사용되는 함수.
[[Reject]] a function object 해당 promise 를 reject 하는 데 사용되는 함수.

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise 는 PromiseCapability Record 를 사용하는 알고리즘 단계 시퀀스의 축약 표현이다. 다음과 같은 알고리즘 단계:

  1. IfAbruptRejectPromise(value, capability).

는 다음과 동일한 의미이다:

  1. Assert: valueCompletion Record 이다.
  2. valueabrupt completion 이면,
    1. Call(capability.[[Reject]], undefined, « value.[[Value]] »)를 수행한다.
    2. capability.[[Promise]] 를 반환한다.
  3. 그렇지 않으면,
    1. value 를 ! value 로 설정한다.

27.2.1.2 PromiseReaction Records

PromiseReaction Record 는 promise 가 특정 값으로 resolved 또는 rejected 될 때 어떻게 반응해야 하는지를 저장하기 위한 Record 값이다. PromiseReaction Record 는 PerformPromiseThen 추상 연산에 의해 생성되며, NewPromiseReactionJob 이 반환하는 Abstract Closure 에 의해 사용된다.

PromiseReaction Record 는 Table 89에 열거된 필드를 가진다.

Table 89: PromiseReaction Record Fields (PromiseReaction 레코드 필드)
Field Name Value Meaning
[[Capability]] a PromiseCapability Record or undefined 이 레코드가 반응 핸들러를 제공하는 promise 의 capability.
[[Type]] fulfill or reject [[Handler]]empty 일 때 처리 유형별 동작을 허용하기 위해 사용된다.
[[Handler]] a JobCallback Record or empty 들어오는 값에 적용되어 그 반환 값이 파생된 promise 에서 일어날 일을 결정하는 함수. [[Handler]]empty 이면 [[Type]] 값에 따라 결정되는 함수가 대신 사용된다.

27.2.1.3 CreateResolvingFunctions ( promise )

The abstract operation CreateResolvingFunctions takes argument promise (a Promise) and returns a Record with fields [[Resolve]] (a function object) and [[Reject]] (a function object). It performs the following steps when called:

  1. alreadyResolvedRecord { [[Value]]: false } 로 둔다.
  2. stepsResolvePromise Resolve Functions 에 정의된 알고리즘 단계로 둔다.
  3. lengthResolvePromise Resolve Functions 에 있는 함수 정의의 선택적이 아닌 매개변수 개수로 둔다.
  4. resolveCreateBuiltinFunction(stepsResolve, lengthResolve, "", « [[Promise]], [[AlreadyResolved]] ») 로 둔다.
  5. resolve.[[Promise]]promise 로 설정한다.
  6. resolve.[[AlreadyResolved]]alreadyResolved 로 설정한다.
  7. stepsRejectPromise Reject Functions 에 정의된 알고리즘 단계로 둔다.
  8. lengthRejectPromise Reject Functions 에 있는 함수 정의의 선택적이 아닌 매개변수 개수로 둔다.
  9. rejectCreateBuiltinFunction(stepsReject, lengthReject, "", « [[Promise]], [[AlreadyResolved]] ») 로 둔다.
  10. reject.[[Promise]]promise 로 설정한다.
  11. reject.[[AlreadyResolved]]alreadyResolved 로 설정한다.
  12. Record { [[Resolve]]: resolve, [[Reject]]: reject } 를 반환한다.

27.2.1.3.1 Promise Reject Functions

Promise reject 함수는 [[Promise]][[AlreadyResolved]] 내부 슬롯을 가진 익명 내장 함수이다.

Promise reject 함수가 인수 reason 과 함께 호출되면 다음 단계를 수행한다:

  1. F 를 활성 함수 객체로 둔다.
  2. Assert: F 는 값이 Object 인 [[Promise]] 내부 슬롯을 가진다.
  3. promiseF.[[Promise]] 로 둔다.
  4. alreadyResolvedF.[[AlreadyResolved]] 로 둔다.
  5. alreadyResolved.[[Value]]true 이면 undefined 를 반환한다.
  6. alreadyResolved.[[Value]]true 로 설정한다.
  7. RejectPromise(promise, reason) 를 수행한다.
  8. undefined 를 반환한다.

Promise reject 함수의 "length" 프로퍼티는 1𝔽 이다.

27.2.1.3.2 Promise Resolve Functions

Promise resolve 함수는 [[Promise]][[AlreadyResolved]] 내부 슬롯을 가진 익명 내장 함수이다.

Promise resolve 함수가 인수 resolution 과 함께 호출되면 다음 단계를 수행한다:

  1. F 를 활성 함수 객체로 둔다.
  2. Assert: F 는 값이 Object 인 [[Promise]] 내부 슬롯을 가진다.
  3. promiseF.[[Promise]] 로 둔다.
  4. alreadyResolvedF.[[AlreadyResolved]] 로 둔다.
  5. alreadyResolved.[[Value]]true 이면 undefined 를 반환한다.
  6. alreadyResolved.[[Value]]true 로 설정한다.
  7. SameValue(resolution, promise) 가 true 이면,
    1. selfResolutionError 를 새로 생성된 TypeError 객체로 둔다.
    2. RejectPromise(promise, selfResolutionError) 를 수행한다.
    3. undefined 를 반환한다.
  8. resolution 이 Object 가 아니면,
    1. FulfillPromise(promise, resolution) 를 수행한다.
    2. undefined 를 반환한다.
  9. thenCompletion(Get(resolution, "then" )) 로 둔다.
  10. thenabrupt completion 이면,
    1. RejectPromise(promise, then.[[Value]]) 를 수행한다.
    2. undefined 를 반환한다.
  11. thenActionthen.[[Value]] 로 둔다.
  12. IsCallable(thenAction) 이 false 이면,
    1. FulfillPromise(promise, resolution) 를 수행한다.
    2. undefined 를 반환한다.
  13. thenJobCallbackHostMakeJobCallback(thenAction) 로 둔다.
  14. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback) 로 둔다.
  15. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) 를 수행한다.
  16. undefined 를 반환한다.

Promise resolve 함수의 "length" 프로퍼티는 1𝔽 이다.

27.2.1.4 FulfillPromise ( promise, value )

The abstract operation FulfillPromise takes arguments promise (a Promise) and value (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. Assert: promise.[[PromiseState]]pending 이다.
  2. reactionspromise.[[PromiseFulfillReactions]] 로 둔다.
  3. promise.[[PromiseResult]]value 로 설정한다.
  4. promise.[[PromiseFulfillReactions]]undefined 로 설정한다.
  5. promise.[[PromiseRejectReactions]]undefined 로 설정한다.
  6. promise.[[PromiseState]]fulfilled 로 설정한다.
  7. TriggerPromiseReactions(reactions, value) 를 수행한다.
  8. unused 를 반환한다.

27.2.1.5 NewPromiseCapability ( C )

The abstract operation NewPromiseCapability takes argument C (an ECMAScript language value) and returns either a normal completion containing a PromiseCapability Record or a throw completion. 내장 Promise 생성자 방식으로 C생성자로 사용하여 promise 를 만들고 그 resolve, reject 함수를 추출하려 시도한다. 그 promise 와 두 함수는 새로운 PromiseCapability Record 를 초기화하는 데 사용된다. It performs the following steps when called:

  1. IsConstructor(C) 가 false 이면 TypeError 예외를 던진다.
  2. 주: C 는 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수라고 가정한다 (27.2.3.1 참조).
  3. resolvingFunctionsRecord { [[Resolve]]: undefined, [[Reject]]: undefined } 로 둔다.
  4. executorClosure 를 매개변수 (resolve, reject) 를 가지고 resolvingFunctions 를 포획하며 호출 시 다음을 수행하는 새로운 Abstract Closure 로 둔다:
    1. resolvingFunctions.[[Resolve]]undefined 가 아니면 TypeError 예외를 던진다.
    2. resolvingFunctions.[[Reject]]undefined 가 아니면 TypeError 예외를 던진다.
    3. resolvingFunctions.[[Resolve]]resolve 로 설정한다.
    4. resolvingFunctions.[[Reject]]reject 로 설정한다.
    5. NormalCompletion(undefined) 를 반환한다.
  5. executorCreateBuiltinFunction(executorClosure, 2, "", « ») 로 둔다.
  6. promise 를 ? Construct(C, « executor ») 로 둔다.
  7. IsCallable(resolvingFunctions.[[Resolve]]) 가 false 이면 TypeError 예외를 던진다.
  8. IsCallable(resolvingFunctions.[[Reject]]) 가 false 이면 TypeError 예외를 던진다.
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFunctions.[[Resolve]], [[Reject]]: resolvingFunctions.[[Reject]] } 를 반환한다.
Note

이 추상 연산은 전달된 executor 함수 인수를 Promise 생성자와 동일한 방식으로 호출하는 어떤 생성자에도 일반화되어 Promise 서브클래싱을 지원한다. 이는 Promise 생성자의 정적 메서드들을 임의의 서브클래스로 일반화하는 데 사용된다.

27.2.1.6 IsPromise ( x )

The abstract operation IsPromise takes argument x (an ECMAScript language value) and returns a Boolean. 객체에 promise 브랜드가 있는지 검사한다. It performs the following steps when called:

  1. x 가 Object 가 아니면 false 를 반환한다.
  2. x[[PromiseState]] 내부 슬롯이 없으면 false 를 반환한다.
  3. true 를 반환한다.

27.2.1.7 RejectPromise ( promise, reason )

The abstract operation RejectPromise takes arguments promise (a Promise) and reason (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. Assert: promise.[[PromiseState]]pending 이다.
    1. reactionspromise.[[PromiseRejectReactions]] 로 둔다.
    2. promise.[[PromiseResult]]reason 으로 설정한다.
    3. promise.[[PromiseFulfillReactions]]undefined 로 설정한다.
    4. promise.[[PromiseRejectReactions]]undefined 로 설정한다.
    5. promise.[[PromiseState]]rejected 로 설정한다.
    6. promise.[[PromiseIsHandled]]false 이면 HostPromiseRejectionTracker(promise, "reject") 를 수행한다.
    7. TriggerPromiseReactions(reactions, reason) 를 수행한다.
    8. unused 를 반환한다.

27.2.1.8 TriggerPromiseReactions ( reactions, argument )

The abstract operation TriggerPromiseReactions takes arguments reactions (a List of PromiseReaction Records) and argument (an ECMAScript language value) and returns unused. reactions 의 각 레코드에 대해 새로운 Job 을 큐잉한다. 각 JobPromiseReaction Record[[Type]][[Handler]] 를 처리하며, [[Handler]]empty 가 아니면 주어진 인수를 전달하여 호출한다. [[Handler]]empty 이면 동작은 [[Type]] 에 의해 결정된다. It performs the following steps when called:

  1. reactions 의 각 요소 reaction 에 대해,
    1. jobNewPromiseReactionJob(reaction, argument) 로 둔다.
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) 를 수행한다.
  2. unused 를 반환한다.

27.2.1.9 HostPromiseRejectionTracker ( promise, operation )

The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (a Promise) and operation ("reject" or "handle") and returns unused. 호스트 환경이 promise rejection 을 추적할 수 있도록 한다.

HostPromiseRejectionTracker 의 기본 구현은 unused 를 반환하는 것이다.

Note 1

HostPromiseRejectionTracker 는 두 시나리오에서 호출된다:

  • Promise 가 핸들러 없이 reject 될 때 operation 인수가 "reject" 로 호출된다.
  • 처음으로 핸들러가 reject 된 promise 에 추가될 때 operation 인수가 "handle" 로 호출된다.

전형적인 구현은 처리되지 않은 rejection 을 개발자에게 알리려고 시도하며, 이후 새로운 핸들러가 부착되어 이전 알림이 무효화되는 경우도 알리도록 주의할 수 있다.

Note 2

operation"handle" 이면 구현은 가비지 컬렉션을 방해하는 방식으로 promise 에 대한 참조를 보유하지 않아야 한다. operation"reject" 이면, rejection 은 드물고 핫 코드 경로가 아닐 것으로 예상되므로 promise 에 대한 참조를 보유할 수 있다.

27.2.2 Promise 작업 (Promise Jobs)

27.2.2.1 NewPromiseReactionJob ( reaction, argument )

The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record) and argument (an ECMAScript language value) and returns a Record with fields [[Job]] (a Job Abstract Closure) and [[Realm]] (a Realm Record or null). 들어오는 값에 적절한 핸들러를 적용하고, 그 핸들러의 반환 값을 사용하여 그 핸들러와 연관된 파생 promise 를 resolve 또는 reject 하는 새로운 Job 추상 클로저를 반환한다. It performs the following steps when called:

  1. job 을 매개변수 없고 reactionargument 를 포획(capture)하며 호출 시 다음 단계를 수행하는 새로운 Job 추상 클로저로 둔다:
    1. promiseCapabilityreaction.[[Capability]] 로 둔다.
    2. typereaction.[[Type]] 로 둔다.
    3. handlerreaction.[[Handler]] 로 둔다.
    4. handlerempty 이면,
      1. typefulfill 이면
        1. handlerResultNormalCompletion(argument) 로 둔다.
      2. 그렇지 않으면,
        1. Assert: typereject.
        2. handlerResultThrowCompletion(argument) 로 둔다.
    5. 그렇지 않으면,
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « argument »)) 로 둔다.
    6. promiseCapabilityundefined 이면,
      1. Assert: handlerResultabrupt completion 이 아님.
      2. empty 를 반환한다.
    7. Assert: promiseCapabilityPromiseCapability Record.
    8. handlerResultabrupt completion 이면,
      1. Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») 를 반환한다.
    9. 그렇지 않으면,
      1. Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») 를 반환한다.
  2. handlerRealmnull 로 둔다.
  3. reaction.[[Handler]]empty 가 아니면,
    1. getHandlerRealmResultCompletion(GetFunctionRealm(reaction.[[Handler]].[[Callback]])) 로 둔다.
    2. getHandlerRealmResultnormal completion 이면 handlerRealmgetHandlerRealmResult.[[Value]] 로 설정한다.
    3. 그렇지 않으면 handlerRealm 을 현재 Realm Record 로 설정한다.
    4. 주: handlerRealm 은 핸들러가 undefined 인 경우를 제외하고 null 이 아니다. 핸들러가 취소된 Proxy 이고 어떤 ECMAScript 코드도 실행되지 않을 때 handlerRealm 은 에러 객체를 생성하는 데 사용된다.
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } 를 반환한다.

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (a Promise), thenable (an Object), and then (a JobCallback Record) and returns a Record with fields [[Job]] (a Job Abstract Closure) and [[Realm]] (a Realm Record). It performs the following steps when called:

  1. job 을 매개변수 없고 promiseToResolve, thenable, then 을 포획하며 호출 시 다음 단계를 수행하는 새로운 Job 추상 클로저로 둔다:
    1. resolvingFunctionsCreateResolvingFunctions(promiseToResolve) 로 둔다.
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) 로 둔다.
    3. thenCallResultabrupt completion 이면,
      1. Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] ») 를 반환한다.
    4. thenCallResult 를 반환한다.
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]])) 로 둔다.
  3. getThenRealmResultnormal completion 이면 thenRealmgetThenRealmResult.[[Value]] 로 둔다.
  4. 그렇지 않으면 thenRealm 을 현재 Realm Record 로 둔다.
  5. 주: thenRealmnull 이 아니다. then.[[Callback]] 이 취소된 Proxy 이고 어떤 코드도 실행되지 않을 때 thenRealm 은 에러 객체 생성을 위해 사용된다.
  6. Record { [[Job]]: job, [[Realm]]: thenRealm } 를 반환한다.
Note

Job 은 제공된 thenable 과 그 then 메서드를 사용하여 주어진 promise 를 resolve 한다. 이 과정은 then 메서드의 평가가 주변 코드의 평가가 끝난 후에 일어나도록 Job 으로 수행되어야 한다.

27.2.3 Promise 생성자 (The Promise Constructor)

Promise 생성자:

  • %Promise% 이다.
  • 전역 객체"Promise" 프로퍼티 초기 값이다.
  • 생성자로 호출될 때 새로운 Promise 를 생성하고 초기화한다.
  • 함수로 호출하는 것은 의도되지 않았으며 그렇게 호출하면 예외를 던진다.
  • 클래스 정의의 extends 절 값으로 사용될 수 있다. 지정된 Promise 동작을 상속하려는 서브클래스 생성자PromisePromise.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성 및 초기화하기 위해 Promise 생성자에 대한 super 호출을 포함해야 한다.

27.2.3.1 Promise ( executor )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 이면 TypeError 예외를 던진다.
  2. IsCallable(executor) 가 false 이면 TypeError 예외를 던진다.
  3. promise 를 ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») 로 둔다.
  4. promise.[[PromiseState]]pending 으로 설정한다.
  5. promise.[[PromiseResult]]empty 로 설정한다.
  6. promise.[[PromiseFulfillReactions]] 를 새로운 빈 List 로 설정한다.
  7. promise.[[PromiseRejectReactions]] 를 새로운 빈 List 로 설정한다.
  8. promise.[[PromiseIsHandled]]false 로 설정한다.
  9. resolvingFunctionsCreateResolvingFunctions(promise) 로 둔다.
  10. completionCompletion(Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) 로 둔다.
  11. completionabrupt completion 이면,
    1. Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») 를 수행한다.
  12. promise 를 반환한다.
Note

executor 인수는 함수 객체여야 한다. 이는 이 Promise 가 표현하는 (지연될 수 있는) 동작을 시작하고 완료를 보고하기 위해 호출된다. Executor 는 두 인수: resolvereject 로 호출된다. 이들은 지연 계산의 최종 완료 또는 실패를 보고하기 위해 executor 함수에서 사용할 수 있는 함수이다. Executor 함수에서 반환하는 것은 지연 동작이 완료되었음을 의미하지 않고 단지 나중에 그 지연 동작을 수행하라는 요청이 수락되었음을 의미한다.

executor 에 전달되는 resolve 함수는 단일 인수를 받는다. executor 코드는 결국 resolve 함수를 호출해 관련 Promise 를 resolve 하려 함을 나타낼 수 있다. resolve 함수에 전달되는 인수는 지연 동작의 최종 값을 나타내며 실제 이행 값이거나 그것이 이행될 경우 값을 제공할 다른 promise 일 수 있다.

executor 에 전달되는 reject 함수는 단일 인수를 받는다. executor 코드는 결국 reject 함수를 호출해 관련 Promise 가 rejected 되었고 결코 fulfilled 되지 않을 것임을 나타낼 수 있다. reject 함수에 전달되는 인수는 promise 의 rejection 값으로 사용되며 일반적으로 Error 객체이다.

Promise 생성자executor 함수에 전달하는 resolve 및 reject 함수는 실제로 해당 promise 를 resolve 및 reject 할 수 있는 능력을 가진다. 서브클래스는 resolve 와 reject 에 대해 사용자 정의 값을 전달하는 다른 생성자 동작을 가질 수 있다.

27.2.4 Promise 생성자의 프로퍼티 (Properties of the Promise Constructor)

Promise 생성자:

  • [[Prototype]] 내부 슬롯 값이 %Function.prototype% 이다.
  • 다음 프로퍼티들을 가진다:

27.2.4.1 Promise.all ( iterable )

이 함수는 전달된 promise 들의 이행 값 배열로 이행되는 새로운 promise 를 반환하거나, 가장 먼저 reject 된 promise 의 reason 으로 reject 된다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.

  1. Cthis 값으로 둔다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. promiseResolveCompletion(GetPromiseResolve(C)) 로 둔다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) 로 둔다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. resultCompletion(PerformPromiseAll(iteratorRecord, C, promiseCapability, promiseResolve)) 로 둔다.
  8. resultabrupt completion 이면,
    1. iteratorRecord.[[Done]]false 이면 resultCompletion(IteratorClose(iteratorRecord, result)) 로 설정한다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. result 를 반환한다.
Note

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 요구한다.

27.2.4.1.1 GetPromiseResolve ( promiseConstructor )

The abstract operation GetPromiseResolve takes argument promiseConstructor (a constructor) and returns either a normal completion containing a function object or a throw completion. It performs the following steps when called:

  1. promiseResolve 를 ? Get(promiseConstructor, "resolve") 로 둔다.
  2. IsCallable(promiseResolve) 가 false 이면 TypeError 예외를 던진다.
  3. promiseResolve 를 반환한다.

27.2.4.1.2 PerformPromiseAll ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. values 를 새로운 빈 List 로 둔다.
  2. remainingElementsCountRecord { [[Value]]: 1 } 로 둔다.
  3. index 를 0 으로 둔다.
  4. 반복,
    1. next 를 ? IteratorStepValue(iteratorRecord) 로 둔다.
    2. nextdone 이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
      2. remainingElementsCount.[[Value]] = 0 이면,
        1. valuesArrayCreateArrayFromList(values) 로 둔다.
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») 를 수행한다.
      3. resultCapability.[[Promise]] 를 반환한다.
    3. undefinedvalues 에 추가한다.
    4. nextPromise 를 ? Call(promiseResolve, constructor, « next ») 로 둔다.
    5. stepsPromise.all Resolve Element Functions 에 정의된 알고리즘 단계로 둔다.
    6. lengthPromise.all Resolve Element Functions 에 있는 함수 정의의 선택적이 아닌 매개변수 개수로 둔다.
    7. onFulfilledCreateBuiltinFunction(steps, length, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») 로 둔다.
    8. onFulfilled.[[AlreadyCalled]]false 로 설정한다.
    9. onFulfilled.[[Index]]index 로 설정한다.
    10. onFulfilled.[[Values]]values 로 설정한다.
    11. onFulfilled.[[Capability]]resultCapability 로 설정한다.
    12. onFulfilled.[[RemainingElements]]remainingElementsCount 로 설정한다.
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 로 설정한다.
    14. Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») 를 수행한다.
    15. indexindex + 1 로 설정한다.

27.2.4.1.3 Promise.all Resolve Element Functions

Promise.all resolve 요소 함수는 특정 Promise.all 요소를 resolve 하는 데 사용되는 익명 내장 함수이다. 각 Promise.all resolve 요소 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.

Promise.all resolve 요소 함수가 인수 x 와 함께 호출되면 다음 단계를 수행한다:

  1. F 를 활성 함수 객체로 둔다.
  2. F.[[AlreadyCalled]]true 이면 undefined 를 반환한다.
  3. F.[[AlreadyCalled]]true 로 설정한다.
  4. indexF.[[Index]] 로 둔다.
  5. valuesF.[[Values]] 로 둔다.
  6. promiseCapabilityF.[[Capability]] 로 둔다.
  7. remainingElementsCountF.[[RemainingElements]] 로 둔다.
  8. values[index] 를 x 로 설정한다.
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
  10. remainingElementsCount.[[Value]] = 0 이면,
    1. valuesArrayCreateArrayFromList(values) 로 둔다.
    2. Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») 를 반환한다.
  11. undefined 를 반환한다.

Promise.all resolve 요소 함수의 "length" 프로퍼티는 1𝔽 이다.

27.2.4.2 Promise.allSettled ( iterable )

이 함수는 모든 원래 promise 가 settled(즉 fulfilled 또는 rejected) 된 후에, promise 상태 스냅샷 객체들의 배열로 이행되는 promise 를 반환한다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.

  1. Cthis 값으로 둔다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. promiseResolveCompletion(GetPromiseResolve(C)) 로 둔다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) 로 둔다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. resultCompletion(PerformPromiseAllSettled(iteratorRecord, C, promiseCapability, promiseResolve)) 로 둔다.
  8. resultabrupt completion 이면,
    1. iteratorRecord.[[Done]]false 이면 resultCompletion(IteratorClose(iteratorRecord, result)) 로 설정한다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. result 를 반환한다.
Note

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 요구한다.

27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. values 를 새로운 빈 List 로 둔다.
  2. remainingElementsCountRecord { [[Value]]: 1 } 로 둔다.
  3. index 를 0 으로 둔다.
  4. 반복,
    1. next 를 ? IteratorStepValue(iteratorRecord) 로 둔다.
    2. nextdone 이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
      2. remainingElementsCount.[[Value]] = 0 이면,
        1. valuesArrayCreateArrayFromList(values) 로 둔다.
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») 를 수행한다.
      3. resultCapability.[[Promise]] 를 반환한다.
    3. undefinedvalues 에 추가한다.
    4. nextPromise 를 ? Call(promiseResolve, constructor, « next ») 로 둔다.
    5. stepsFulfilledPromise.allSettled Resolve Element Functions 에 정의된 알고리즘 단계로 둔다.
    6. lengthFulfilledPromise.allSettled Resolve Element Functions 에 있는 함수 정의의 선택적이 아닌 매개변수 개수로 둔다.
    7. onFulfilledCreateBuiltinFunction(stepsFulfilled, lengthFulfilled, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») 로 둔다.
    8. alreadyCalledRecord { [[Value]]: false } 로 둔다.
    9. onFulfilled.[[AlreadyCalled]]alreadyCalled 로 설정한다.
    10. onFulfilled.[[Index]]index 로 설정한다.
    11. onFulfilled.[[Values]]values 로 설정한다.
    12. onFulfilled.[[Capability]]resultCapability 로 설정한다.
    13. onFulfilled.[[RemainingElements]]remainingElementsCount 로 설정한다.
    14. stepsRejectedPromise.allSettled Reject Element Functions 에 정의된 알고리즘 단계로 둔다.
    15. lengthRejectedPromise.allSettled Reject Element Functions 에 있는 함수 정의의 선택적이 아닌 매개변수 개수로 둔다.
    16. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») 로 둔다.
    17. onRejected.[[AlreadyCalled]]alreadyCalled 로 설정한다.
    18. onRejected.[[Index]]index 로 설정한다.
    19. onRejected.[[Values]]values 로 설정한다.
    20. onRejected.[[Capability]]resultCapability 로 설정한다.
    21. onRejected.[[RemainingElements]]remainingElementsCount 로 설정한다.
    22. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 로 설정한다.
    23. Invoke(nextPromise, "then", « onFulfilled, onRejected ») 를 수행한다.
    24. indexindex + 1 로 설정한다.

27.2.4.2.2 Promise.allSettled Resolve Element Functions

Promise.allSettled resolve 요소 함수는 특정 Promise.allSettled 요소를 resolve 하는 데 사용되는 익명 내장 함수이다. 각 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.

Promise.allSettled resolve 요소 함수가 인수 x 로 호출되면 다음 단계를 수행한다:

  1. F 를 활성 함수 객체로 둔다.
  2. alreadyCalledF.[[AlreadyCalled]] 로 둔다.
  3. alreadyCalled.[[Value]]true 이면 undefined 를 반환한다.
  4. alreadyCalled.[[Value]]true 로 설정한다.
  5. indexF.[[Index]] 로 둔다.
  6. valuesF.[[Values]] 로 둔다.
  7. promiseCapabilityF.[[Capability]] 로 둔다.
  8. remainingElementsCountF.[[RemainingElements]] 로 둔다.
  9. objOrdinaryObjectCreate(%Object.prototype%) 로 둔다.
  10. CreateDataPropertyOrThrow(obj, "status", "fulfilled") 를 수행한다.
  11. CreateDataPropertyOrThrow(obj, "value", x) 를 수행한다.
  12. values[index] 를 obj 로 설정한다.
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
  14. remainingElementsCount.[[Value]] = 0 이면,
    1. valuesArrayCreateArrayFromList(values) 로 둔다.
    2. Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») 를 반환한다.
  15. undefined 를 반환한다.

Promise.allSettled resolve 요소 함수의 "length" 프로퍼티는 1𝔽 이다.

27.2.4.2.3 Promise.allSettled Reject Element Functions

Promise.allSettled reject 요소 함수는 특정 Promise.allSettled 요소를 reject 하는 데 사용되는 익명 내장 함수이다. 각 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.

Promise.allSettled reject 요소 함수가 인수 x 로 호출되면 다음 단계를 수행한다:

  1. F 를 활성 함수 객체로 둔다.
  2. alreadyCalledF.[[AlreadyCalled]] 로 둔다.
  3. alreadyCalled.[[Value]]true 이면 undefined 를 반환한다.
  4. alreadyCalled.[[Value]]true 로 설정한다.
  5. indexF.[[Index]] 로 둔다.
  6. valuesF.[[Values]] 로 둔다.
  7. promiseCapabilityF.[[Capability]] 로 둔다.
  8. remainingElementsCountF.[[RemainingElements]] 로 둔다.
  9. objOrdinaryObjectCreate(%Object.prototype%) 로 둔다.
  10. CreateDataPropertyOrThrow(obj, "status", "rejected") 를 수행한다.
  11. CreateDataPropertyOrThrow(obj, "reason", x) 를 수행한다.
  12. values[index] 를 obj 로 설정한다.
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
  14. remainingElementsCount.[[Value]] = 0 이면,
    1. valuesArrayCreateArrayFromList(values) 로 둔다.
    2. Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») 를 반환한다.
  15. undefined 를 반환한다.

Promise.allSettled reject 요소 함수의 "length" 프로퍼티는 1𝔽 이다.

27.2.4.3 Promise.any ( iterable )

이 함수는 전달된 promise 중 처음 fulfilled 되는 promise 로 fulfilled 되거나, 모두 rejected 되면 rejection reason 들을 담은 AggregateError 로 reject 되는 promise 를 반환한다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.

  1. Cthis 값으로 둔다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. promiseResolveCompletion(GetPromiseResolve(C)) 로 둔다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) 로 둔다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. resultCompletion(PerformPromiseAny(iteratorRecord, C, promiseCapability, promiseResolve)) 로 둔다.
  8. resultabrupt completion 이면,
    1. iteratorRecord.[[Done]]false 이면 resultCompletion(IteratorClose(iteratorRecord, result)) 로 설정한다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. result 를 반환한다.
Note

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 요구한다.

27.2.4.3.1 PerformPromiseAny ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. errors 를 새로운 빈 List 로 둔다.
  2. remainingElementsCountRecord { [[Value]]: 1 } 로 둔다.
  3. index 를 0 으로 둔다.
  4. 반복,
    1. next 를 ? IteratorStepValue(iteratorRecord) 로 둔다.
    2. nextdone 이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
      2. remainingElementsCount.[[Value]] = 0 이면,
        1. error 를 새로 생성된 AggregateError 객체로 둔다.
        2. DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) 를 수행한다.
        3. ThrowCompletion(error) 를 반환한다.
      3. resultCapability.[[Promise]] 를 반환한다.
    3. undefinederrors 에 추가한다.
    4. nextPromise 를 ? Call(promiseResolve, constructor, « next ») 로 둔다.
    5. stepsRejectedPromise.any Reject Element Functions 에 정의된 알고리즘 단계로 둔다.
    6. lengthRejectedPromise.any Reject Element Functions 에 있는 함수 정의의 선택적이 아닌 매개변수 개수로 둔다.
    7. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Errors]], [[Capability]], [[RemainingElements]] ») 로 둔다.
    8. onRejected.[[AlreadyCalled]]false 로 설정한다.
    9. onRejected.[[Index]]index 로 설정한다.
    10. onRejected.[[Errors]]errors 로 설정한다.
    11. onRejected.[[Capability]]resultCapability 로 설정한다.
    12. onRejected.[[RemainingElements]]remainingElementsCount 로 설정한다.
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 로 설정한다.
    14. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») 를 수행한다.
    15. indexindex + 1 로 설정한다.

27.2.4.3.2 Promise.any Reject Element Functions

Promise.any reject 요소 함수는 특정 Promise.any 요소를 reject 하는 데 사용되는 익명 내장 함수이다. 각 함수는 [[Index]], [[Errors]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.

Promise.any reject 요소 함수가 인수 x 로 호출되면 다음 단계를 수행한다:

  1. F 를 활성 함수 객체로 둔다.
  2. F.[[AlreadyCalled]]true 이면 undefined 를 반환한다.
  3. F.[[AlreadyCalled]]true 로 설정한다.
  4. indexF.[[Index]] 로 둔다.
  5. errorsF.[[Errors]] 로 둔다.
  6. promiseCapabilityF.[[Capability]] 로 둔다.
  7. remainingElementsCountF.[[RemainingElements]] 로 둔다.
  8. errors[index] 를 x 로 설정한다.
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 로 설정한다.
  10. remainingElementsCount.[[Value]] = 0 이면,
    1. error 를 새로 생성된 AggregateError 객체로 둔다.
    2. DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) 를 수행한다.
    3. Call(promiseCapability.[[Reject]], undefined, « error ») 를 반환한다.
  11. undefined 를 반환한다.

Promise.any reject 요소 함수의 "length" 프로퍼티는 1𝔽 이다.

27.2.4.4 Promise.prototype

Promise.prototype 의 초기 값은 Promise 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

27.2.4.5 Promise.race ( iterable )

이 함수는 가장 먼저 settle 되는 전달된 promise 와 동일한 방식으로 settle 되는 새 promise 를 반환한다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.

  1. Cthis 값으로 둔다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. promiseResolveCompletion(GetPromiseResolve(C)) 로 둔다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) 로 둔다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. resultCompletion(PerformPromiseRace(iteratorRecord, C, promiseCapability, promiseResolve)) 로 둔다.
  8. resultabrupt completion 이면,
    1. iteratorRecord.[[Done]]false 이면 resultCompletion(IteratorClose(iteratorRecord, result)) 로 설정한다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. result 를 반환한다.
Note 1

iterable 인수가 어떤 값도 산출하지 않거나 iterable 이 산출한 promise 들 중 어느 것도 settle 되지 않으면, 이 메서드가 반환하는 pending promise 는 결코 settle 되지 않는다.

Note 2

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이며 또한 resolve 메서드를 제공한다고 기대한다.

27.2.4.5.1 PerformPromiseRace ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. 반복,
    1. next 를 ? IteratorStepValue(iteratorRecord) 로 둔다.
    2. nextdone 이면,
      1. resultCapability.[[Promise]] 를 반환한다.
    3. nextPromise 를 ? Call(promiseResolve, constructor, « next ») 로 둔다.
    4. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») 를 수행한다.

27.2.4.6 Promise.reject ( r )

이 함수는 전달된 인수로 reject 된 새로운 promise 를 반환한다.

  1. Cthis 값으로 둔다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. Call(promiseCapability.[[Reject]], undefined, « r ») 를 수행한다.
  4. promiseCapability.[[Promise]] 를 반환한다.
Note

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 기대한다.

27.2.4.7 Promise.resolve ( x )

이 함수는 전달된 인수로 resolve 된 새로운 promise 를 반환하거나, 인수가 이 생성자가 생성한 promise 라면 그 인수 자체를 반환한다.

  1. Cthis 값으로 둔다.
  2. C 가 Object 가 아니면 TypeError 예외를 던진다.
  3. PromiseResolve(C, x) 를 반환한다.
Note

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 기대한다.

27.2.4.7.1 PromiseResolve ( C, x )

The abstract operation PromiseResolve takes arguments C (an Object) and x (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. x 로 resolve 된 새로운 promise 를 반환한다. It performs the following steps when called:

  1. IsPromise(x) 가 true 이면,
    1. xConstructor 를 ? Get(x, "constructor") 로 둔다.
    2. SameValue(xConstructor, C) 가 true 이면 x 를 반환한다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. Call(promiseCapability.[[Resolve]], undefined, « x ») 를 수행한다.
  4. promiseCapability.[[Promise]] 를 반환한다.

27.2.4.8 Promise.try ( callback, ...args )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. Cthis 값으로 둔다.
  2. C 가 Object 가 아니면 TypeError 예외를 던진다.
  3. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  4. statusCompletion(Call(callback, undefined, args)) 로 둔다.
  5. statusabrupt completion 이면,
    1. Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») 를 수행한다.
  6. 그렇지 않으면,
    1. Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] ») 를 수행한다.
  7. promiseCapability.[[Promise]] 를 반환한다.
Note

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 기대한다.

27.2.4.9 Promise.withResolvers ( )

이 함수는 세 개의 프로퍼티를 가진 객체를 반환한다: 새로운 promise 와 그에 연관된 resolvereject 함수.

  1. Cthis 값으로 둔다.
  2. promiseCapability 를 ? NewPromiseCapability(C) 로 둔다.
  3. objOrdinaryObjectCreate(%Object.prototype%) 로 둔다.
  4. CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]]) 를 수행한다.
  5. CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]]) 를 수행한다.
  6. CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]]) 를 수행한다.
  7. obj 를 반환한다.

27.2.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%] 는 set 접근자 함수가 undefined접근자 프로퍼티이다. 그 get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. this 값을 반환한다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 이다.

Note

Promise 프로토타입 메서드는 일반적으로 파생 객체를 생성하기 위해 this 값의 생성자를 사용한다. 그러나 서브클래스 생성자는 그 %Symbol.species% 프로퍼티를 재정의하여 기본 동작을 바꿀 수 있다.

27.2.5 Promise 프로토타입 객체의 프로퍼티 (Properties of the Promise Prototype Object)

Promise 프로토타입 객체는 다음과 같다:

  • %Promise.prototype% 이다.
  • [[Prototype]] 내부 슬롯의 값이 %Object.prototype% 이다.
  • 일반 객체이다.
  • [[PromiseState]] 내부 슬롯이나 Promise 인스턴스의 다른 어떤 내부 슬롯도 가지지 않는다.

27.2.5.1 Promise.prototype.catch ( onRejected )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. promisethis 값으로 둔다.
  2. Invoke(promise, "then", « undefined, onRejected ») 를 반환한다.

27.2.5.2 Promise.prototype.constructor

Promise.prototype.constructor 의 초기 값은 %Promise% 이다.

27.2.5.3 Promise.prototype.finally ( onFinally )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. promisethis 값으로 둔다.
  2. promise 가 Object 가 아니면 TypeError 예외를 던진다.
  3. C 를 ? SpeciesConstructor(promise, %Promise%) 로 둔다.
  4. Assert: IsConstructor(C) 는 true.
  5. IsCallable(onFinally) 가 false 이면,
    1. thenFinallyonFinally 로 둔다.
    2. catchFinallyonFinally 로 둔다.
  6. 그렇지 않으면,
    1. thenFinallyClosure 를 매개변수 (value) 를 가지고 onFinallyC 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
      1. result 를 ? Call(onFinally, undefined) 로 둔다.
      2. p 를 ? PromiseResolve(C, result) 로 둔다.
      3. returnValue 를 매개변수 없는 새로운 Abstract Closure 로 두고 value 를 포획하며 호출 시 다음 단계를 수행하게 한다:
        1. NormalCompletion(value) 를 반환한다.
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « ») 로 둔다.
      5. Invoke(p, "then", « valueThunk ») 를 반환한다.
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « ») 로 둔다.
    3. catchFinallyClosure 를 매개변수 (reason) 를 가지고 onFinallyC 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
      1. result 를 ? Call(onFinally, undefined) 로 둔다.
      2. p 를 ? PromiseResolve(C, result) 로 둔다.
      3. throwReason 을 매개변수 없는 새로운 Abstract Closure 로 두고 reason 을 포획하며 호출 시 다음 단계를 수행하게 한다:
        1. ThrowCompletion(reason) 를 반환한다.
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « ») 로 둔다.
      5. Invoke(p, "then", « thrower ») 를 반환한다.
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « ») 로 둔다.
  7. Invoke(promise, "then", « thenFinally, catchFinally ») 를 반환한다.

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. promisethis 값으로 둔다.
  2. IsPromise(promise) 가 false 이면 TypeError 예외를 던진다.
  3. C 를 ? SpeciesConstructor(promise, %Promise%) 로 둔다.
  4. resultCapability 를 ? NewPromiseCapability(C) 로 둔다.
  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability) 를 반환한다.

27.2.5.4.1 PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )

The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an ECMAScript language value. promise 에 대해 onFulfilledonRejected 를 정착(settlement) 동작으로 사용하여 “then” 연산을 수행한다. resultCapability 가 전달되면 그 promise 를 갱신하여 결과를 저장한다. 전달되지 않은 경우, 결과가 중요하지 않은 명세 내부 연산에 의해 호출된 것이다. It performs the following steps when called:

  1. Assert: IsPromise(promise) 는 true.
  2. resultCapability 가 존재하지 않으면,
    1. resultCapabilityundefined 로 설정한다.
  3. IsCallable(onFulfilled) 가 false 이면
    1. onFulfilledJobCallbackempty 로 둔다.
  4. 그렇지 않으면,
    1. onFulfilledJobCallbackHostMakeJobCallback(onFulfilled) 로 둔다.
  5. IsCallable(onRejected) 가 false 이면
    1. onRejectedJobCallbackempty 로 둔다.
  6. 그렇지 않으면,
    1. onRejectedJobCallbackHostMakeJobCallback(onRejected) 로 둔다.
  7. fulfillReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback } 로 둔다.
  8. rejectReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback } 로 둔다.
  9. promise.[[PromiseState]]pending 이면,
    1. fulfillReactionpromise.[[PromiseFulfillReactions]] 에 추가한다.
    2. rejectReactionpromise.[[PromiseRejectReactions]] 에 추가한다.
  10. 그렇지 않고 promise.[[PromiseState]]fulfilled 이면,
    1. valuepromise.[[PromiseResult]] 로 둔다.
    2. fulfillJobNewPromiseReactionJob(fulfillReaction, value) 로 둔다.
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) 를 수행한다.
  11. 그렇지 않으면,
    1. Assert: promise.[[PromiseState]]rejected.
    2. reasonpromise.[[PromiseResult]] 로 둔다.
    3. promise.[[PromiseIsHandled]]false 이면 HostPromiseRejectionTracker(promise, "handle") 를 수행한다.
    4. rejectJobNewPromiseReactionJob(rejectReaction, reason) 로 둔다.
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) 를 수행한다.
  12. promise.[[PromiseIsHandled]]true 로 설정한다.
  13. resultCapabilityundefined 이면
    1. undefined 를 반환한다.
  14. 그렇지 않으면
    1. resultCapability.[[Promise]] 를 반환한다.

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "Promise" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.2.6 Promise 인스턴스의 프로퍼티 (Properties of Promise Instances)

Promise 인스턴스는 (내재 %Promise.prototype%) Promise 프로토타입 객체로부터 프로퍼티를 상속하는 일반 객체이다. Promise 인스턴스는 Table 90에 기술된 내부 슬롯을 가지고 초기화된다.

Table 90: Promise 인스턴스의 내부 슬롯 (Internal Slots of Promise Instances)
Internal Slot Type Description
[[PromiseState]] pending, fulfilled, or rejected 해당 promise 의 then 메서드로의 호출에 어떻게 반응할지 결정한다.
[[PromiseResult]] an ECMAScript language value or empty promise 가 fulfilled 또는 rejected 된 값(있다면). [[PromiseState]]pending 일 때 그리고 그 때에만 empty.
[[PromiseFulfillReactions]] a List of PromiseReaction Records promise 가 pending 에서 fulfilled 상태로 전이할 때 처리될 기록들.
[[PromiseRejectReactions]] a List of PromiseReaction Records promise 가 pending 에서 rejected 상태로 전이할 때 처리될 기록들.
[[PromiseIsHandled]] a Boolean 이 promise 가 한 번이라도 fulfillment 또는 rejection 핸들러를 가졌는지 나타내며, 처리되지 않은 거부 추적(unhandled rejection tracking)에 사용된다.

27.3 GeneratorFunction 객체 (GeneratorFunction Objects)

GeneratorFunction 들은 보통 GeneratorDeclaration, GeneratorExpression, GeneratorMethod 를 평가하여 생성되는 함수들이다. 또한 %GeneratorFunction% 내재(intrinsic)를 호출하여 생성될 수도 있다.

Figure 6 (Informative): Generator 객체 간의 관계 (Generator Objects Relationships)
수많은 상자와 화살표의 구조도.

27.3.1 GeneratorFunction 생성자 (The GeneratorFunction Constructor)

GeneratorFunction 생성자는 다음과 같다:

  • %GeneratorFunction% 이다.
  • Function 의 서브클래스이다.
  • 생성자가 아니라 함수로 호출될 때 새 GeneratorFunction 을 생성하고 초기화한다. 따라서 함수 호출 GeneratorFunction (…) 은 동일한 인수로 new GeneratorFunction (…) 객체 생성 표현식과 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 GeneratorFunction 동작을 상속하려는 서브클래스 생성자는 내장 GeneratorFunction 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 GeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. 제너레이터 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 GeneratorFunction 의 직접 인스턴스를 생성한다. GeneratorFunction 서브클래스 인스턴스를 만들 수 있는 문법적 수단은 없다.

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 제너레이터 함수의 본문(실행 코드)을 지정한다; 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출될 때 다음 단계를 수행한다:

  1. C 를 활성 함수 객체로 둔다.
  2. bodyArg 가 존재하지 않으면 bodyArg 를 빈 문자열로 설정한다.
  3. CreateDynamicFunction(C, NewTarget, generator, parameterArgs, bodyArg) 를 반환한다.
Note

20.2.1.1 의 NOTE 를 참조.

27.3.2 GeneratorFunction 생성자의 프로퍼티 (Properties of the GeneratorFunction Constructor)

GeneratorFunction 생성자는 다음과 같다:

  • Function 생성자로부터 상속하는 표준 내장 함수 객체이다.
  • [[Prototype]] 내부 슬롯 값이 %Function% 이다.
  • 𝔽 이다.
  • "name" 프로퍼티 값이 "GeneratorFunction" 이다.
  • 다음 프로퍼티들을 가진다:

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype 의 초기 값은 GeneratorFunction 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

27.3.3 GeneratorFunction 프로토타입 객체의 프로퍼티 (Properties of the GeneratorFunction Prototype Object)

GeneratorFunction 프로토타입 객체는 다음과 같다:

27.3.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor 의 초기 값은 %GeneratorFunction% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.3.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype 의 초기 값은 %GeneratorPrototype% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "GeneratorFunction" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.3.4 GeneratorFunction 인스턴스 (GeneratorFunction Instances)

모든 GeneratorFunction 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 열거된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false 이다.

각 GeneratorFunction 인스턴스는 다음 자체 프로퍼티들을 가진다:

27.3.4.1 length

20.2.4.1 에 기술된 Function 인스턴스의 "length" 프로퍼티 명세는 GeneratorFunction 인스턴스에도 적용된다.

27.3.4.2 name

20.2.4.2 에 기술된 Function 인스턴스의 "name" 프로퍼티 명세는 GeneratorFunction 인스턴스에도 적용된다.

27.3.4.3 prototype

GeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체가 생성되어 해당 제너레이터 함수의 "prototype" 프로퍼티 초기 값이 된다. 이 prototype 프로퍼티의 값은 제너레이터 함수 객체[[Call]] 로 호출될 때 새로 생성되는 Generator 의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용된다.

이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

Note

Function 인스턴스와 달리, GeneratorFunction 의 "prototype" 프로퍼티 값인 객체는 그 값이 해당 GeneratorFunction 인스턴스인 "constructor" 프로퍼티를 가지지 않는다.

27.4 AsyncGeneratorFunction 객체 (AsyncGeneratorFunction Objects)

AsyncGeneratorFunction 들은 보통 AsyncGeneratorDeclaration, AsyncGeneratorExpression, AsyncGeneratorMethod 문법 생산물을 평가하여 생성된다. 또한 %AsyncGeneratorFunction% 내재를 호출하여 생성될 수 있다.

27.4.1 AsyncGeneratorFunction 생성자 (The AsyncGeneratorFunction Constructor)

AsyncGeneratorFunction 생성자는 다음과 같다:

  • %AsyncGeneratorFunction% 이다.
  • Function 의 서브클래스이다.
  • 생성자가 아니라 함수로 호출될 때 새 AsyncGeneratorFunction 을 생성하고 초기화한다. 따라서 AsyncGeneratorFunction (...) 호출은 동일한 인수의 new AsyncGeneratorFunction (...) 과 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 AsyncGeneratorFunction 동작을 상속하려는 서브클래스 생성자는 내장 AsyncGeneratorFunction 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 AsyncGeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. async generator 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 AsyncGeneratorFunction 의 직접 인스턴스를 생성한다. AsyncGeneratorFunction 서브클래스 인스턴스를 만들 수 있는 문법적 수단은 없다.

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 async generator 함수의 본문(실행 코드)을 지정한다; 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출될 때 다음 단계를 수행한다:

  1. C 를 활성 함수 객체로 둔다.
  2. bodyArg 가 존재하지 않으면 bodyArg 를 빈 문자열로 설정한다.
  3. CreateDynamicFunction(C, NewTarget, async-generator, parameterArgs, bodyArg) 를 반환한다.
Note

20.2.1.1 의 NOTE 를 참조.

27.4.2 AsyncGeneratorFunction 생성자의 프로퍼티 (Properties of the AsyncGeneratorFunction Constructor)

AsyncGeneratorFunction 생성자는 다음과 같다:

  • Function 생성자로부터 상속하는 표준 내장 함수 객체이다.
  • [[Prototype]] 내부 슬롯 값이 %Function% 이다.
  • 𝔽 이다.
  • "name" 프로퍼티 값이 "AsyncGeneratorFunction" 이다.
  • 다음 프로퍼티들을 가진다:

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype 의 초기 값은 AsyncGeneratorFunction 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

27.4.3 AsyncGeneratorFunction 프로토타입 객체의 프로퍼티 (Properties of the AsyncGeneratorFunction Prototype Object)

AsyncGeneratorFunction 프로토타입 객체는 다음과 같다:

27.4.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor 의 초기 값은 %AsyncGeneratorFunction% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.4.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype 의 초기 값은 %AsyncGeneratorPrototype% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "AsyncGeneratorFunction" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.4.4 AsyncGeneratorFunction 인스턴스 (AsyncGeneratorFunction Instances)

모든 AsyncGeneratorFunction 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 열거된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false 이다.

각 AsyncGeneratorFunction 인스턴스는 다음 자체 프로퍼티들을 가진다:

27.4.4.1 length

"length" 프로퍼티의 값은 AsyncGeneratorFunction 이 일반적으로 기대하는 인수 개수를 나타내는 정수 Number 이다. 그러나 언어는 다른 개수의 인수로 호출하는 것을 허용한다. "length" 프로퍼티에 지정된 것과 다른 인수 개수로 호출될 때의 AsyncGeneratorFunction 동작은 함수에 따라 다르다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.4.4.2 name

20.2.4.2 에 기술된 Function 인스턴스의 "name" 프로퍼티 명세는 AsyncGeneratorFunction 인스턴스에도 적용된다.

27.4.4.3 prototype

AsyncGeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체가 생성되어 해당 async generator 함수의 "prototype" 프로퍼티 초기 값이 된다. 이 prototype 프로퍼티 값은 generator 함수 객체[[Call]] 로 호출될 때 새로 생성되는 AsyncGenerator 의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용된다.

이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

Note

function 인스턴스와 달리, AsyncGeneratorFunction 의 "prototype" 프로퍼티 값인 객체는 그 값이 해당 AsyncGeneratorFunction 인스턴스인 "constructor" 프로퍼티를 가지지 않는다.

27.5 Generator 객체 (Generator Objects)

Generator 는 제너레이터 함수를 호출하여 생성되며 이터레이터 인터페이스와 iterable 인터페이스를 모두 준수한다.

Generator 인스턴스는 그것을 생성한 제너레이터 함수의 "prototype" 프로퍼티 초기 값으로부터 직접 프로퍼티를 상속한다. Generator 인스턴스는 %GeneratorPrototype% 으로부터 간접적으로 프로퍼티를 상속한다.

27.5.1 %GeneratorPrototype% 객체 (The %GeneratorPrototype% Object)

%GeneratorPrototype% 객체는 다음과 같다:

  • %GeneratorFunction.prototype.prototype% 이다.
  • 일반 객체이다.
  • Generator 인스턴스가 아니며 [[GeneratorState]] 내부 슬롯을 가지지 않는다.
  • [[Prototype]] 내부 슬롯 값이 %Iterator.prototype% 이다.
  • 모든 Generator 인스턴스가 간접적으로 상속하는 프로퍼티들을 가진다.

27.5.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor 의 초기 값은 %GeneratorFunction.prototype% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.5.1.2 %GeneratorPrototype%.next ( value )

  1. GeneratorResume(this value, value, empty) 를 반환한다.

27.5.1.3 %GeneratorPrototype%.return ( value )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. gthis 값으로 둔다.
  2. CReturnCompletion(value) 로 둔다.
  3. GeneratorResumeAbrupt(g, C, empty) 를 반환한다.

27.5.1.4 %GeneratorPrototype%.throw ( exception )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. gthis 값으로 둔다.
  2. CThrowCompletion(exception) 로 둔다.
  3. GeneratorResumeAbrupt(g, C, empty) 를 반환한다.

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "Generator" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.5.2 Generator 인스턴스의 프로퍼티 (Properties of Generator Instances)

Generator 인스턴스는 Table 91 에 기술된 내부 슬롯을 가지고 초기화된다.

Table 91: Generator 인스턴스의 내부 슬롯 (Internal Slots of Generator Instances)
Internal Slot Type Description
[[GeneratorState]] suspended-start, suspended-yield, executing, or completed 제너레이터의 현재 실행 상태.
[[GeneratorContext]] an execution context 이 제너레이터의 코드를 실행할 때 사용되는 실행 컨텍스트.
[[GeneratorBrand]] a String or empty 서로 다른 종류의 제너레이터를 구분하는 브랜드. ECMAScript 소스 텍스트로 선언된 제너레이터의 [[GeneratorBrand]] 는 항상 empty.

27.5.3 Generator 추상 연산 (Generator Abstract Operations)

27.5.3.1 GeneratorStart ( generator, generatorBody )

The abstract operation GeneratorStart takes arguments generator (a Generator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[GeneratorState]]suspended-start.
  2. genContext 를 실행 중인 실행 컨텍스트로 둔다.
  3. genContext 의 Generator 컴포넌트를 generator 로 설정한다.
  4. closure 를 매개변수 없고 generatorBody 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. acGenContext 를 실행 중인 실행 컨텍스트로 둔다.
    2. acGeneratoracGenContext 의 Generator 컴포넌트로 둔다.
    3. generatorBody 가 Parse Node 이면
      1. resultCompletion(Evaluation of generatorBody) 로 둔다.
    4. 그렇지 않으면
      1. Assert: generatorBody 는 매개변수 없는 Abstract Closure.
      2. resultCompletion(generatorBody()) 로 둔다.
    5. Assert: 여기로 돌아오면 제너레이터는 예외를 던졌거나 암시적 또는 명시적 return 을 수행했다.
    6. acGenContext 를 실행 컨텍스트 스택에서 제거하고 스택 꼭대기 실행 컨텍스트를 실행 중인 컨텍스트로 복원한다.
    7. acGenerator.[[GeneratorState]]completed 로 설정한다.
    8. 주: 제너레이터가 completed 상태에 들어가면 다시 나오지 않고 그 연관 실행 컨텍스트는 재개되지 않는다. acGenerator 와 연관된 실행 상태는 이 시점에서 폐기 가능.
    9. resultnormal completion 이면
      1. resultValueundefined 로 둔다.
    10. Else if resultreturn completion 이면
      1. resultValueresult.[[Value]] 로 둔다.
    11. Else,
      1. Assert: resultthrow completion.
      2. result 를 반환한다.
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true)) 를 반환한다.
  5. genContext 의 코드 평가 상태를 설정하여 해당 실행 컨텍스트가 재개될 때 closure 가 인수 없이 호출되도록 한다.
  6. generator.[[GeneratorContext]]genContext 로 설정한다.
  7. unused 를 반환한다.

27.5.3.2 GeneratorValidate ( generator, generatorBrand )

The abstract operation GeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns either a normal completion containing one of suspended-start, suspended-yield, or completed, or a throw completion. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[GeneratorState]]) 를 수행한다.
  2. RequireInternalSlot(generator, [[GeneratorBrand]]) 를 수행한다.
  3. generator.[[GeneratorBrand]]generatorBrand 와 다르면 TypeError 예외를 던진다.
  4. Assert: generator 는 또한 [[GeneratorContext]] 내부 슬롯을 가진다.
  5. stategenerator.[[GeneratorState]] 로 둔다.
  6. stateexecuting 이면 TypeError 예외를 던진다.
  7. state 를 반환한다.

27.5.3.3 GeneratorResume ( generator, value, generatorBrand )

The abstract operation GeneratorResume takes arguments generator (an ECMAScript language value), value (an ECMAScript language value or empty), and generatorBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. state 를 ? GeneratorValidate(generator, generatorBrand) 로 둔다.
  2. statecompleted 이면 CreateIteratorResultObject(undefined, true) 를 반환한다.
  3. Assert: statesuspended-start 또는 suspended-yield.
  4. genContextgenerator.[[GeneratorContext]] 로 둔다.
  5. methodContext 를 실행 중인 실행 컨텍스트로 둔다.
  6. methodContext 를 suspend 한다.
  7. generator.[[GeneratorState]]executing 으로 설정한다.
  8. genContext 를 실행 컨텍스트 스택에 push; 이제 genContext 가 실행 중인 실행 컨텍스트.
  9. genContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 NormalCompletion(value) 를 사용한다. result 를 재개된 계산이 반환한 값으로 둔다.
  10. Assert: 여기로 돌아올 때 genContext 는 이미 실행 컨텍스트 스택에서 제거되었고 methodContext 가 현재 실행 중인 실행 컨텍스트.
  11. result 를 반환한다.

27.5.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion, generatorBrand )

The abstract operation GeneratorResumeAbrupt takes arguments generator (an ECMAScript language value), abruptCompletion (a return completion or a throw completion), and generatorBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. state 를 ? GeneratorValidate(generator, generatorBrand) 로 둔다.
  2. statesuspended-start 이면
    1. generator.[[GeneratorState]]completed 로 설정한다.
    2. 주: 제너레이터가 completed 상태에 들어가면 다시 나오지 않고 연관 실행 컨텍스트는 재개되지 않는다. generator 와 연관된 실행 상태는 이 시점에서 폐기 가능.
    3. statecompleted 로 설정한다.
  3. statecompleted 이면
    1. abruptCompletionreturn completion 이면
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true) 를 반환한다.
    2. abruptCompletion 를 반환한다.
  4. Assert: statesuspended-yield.
  5. genContextgenerator.[[GeneratorContext]] 로 둔다.
  6. methodContext 를 실행 중인 실행 컨텍스트로 둔다.
  7. methodContext 를 suspend 한다.
  8. generator.[[GeneratorState]]executing 으로 설정한다.
  9. genContext 를 실행 컨텍스트 스택에 push; 이제 genContext 가 실행 중인 실행 컨텍스트.
  10. genContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 abruptCompletion 을 사용한다. result 를 재개된 계산이 반환한 Completion Record 로 둔다.
  11. Assert: 여기로 돌아올 때 genContext 는 이미 실행 컨텍스트 스택에서 제거되었고 methodContext 가 현재 실행 중인 실행 컨텍스트.
  12. result 를 반환한다.

27.5.3.5 GetGeneratorKind ( )

The abstract operation GetGeneratorKind takes no arguments and returns non-generator, sync, or async. It performs the following steps when called:

  1. genContext 를 실행 중인 실행 컨텍스트로 둔다.
  2. genContext 가 Generator 컴포넌트를 가지지 않으면 non-generator 를 반환한다.
  3. generatorgenContext 의 Generator 컴포넌트 값으로 둔다.
  4. generator[[AsyncGeneratorState]] 내부 슬롯이 있으면 async 를 반환한다.
  5. 아니면 sync 를 반환한다.

27.5.3.6 GeneratorYield ( iteratorResult )

The abstract operation GeneratorYield takes argument iteratorResult (an Object that conforms to the IteratorResult interface) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. genContext 를 실행 중인 실행 컨텍스트로 둔다.
  2. Assert: genContext 는 제너레이터의 실행 컨텍스트.
  3. generatorgenContext 의 Generator 컴포넌트 값으로 둔다.
  4. Assert: GetGeneratorKind() 는 sync.
  5. generator.[[GeneratorState]]suspended-yield 로 설정한다.
  6. genContext 를 실행 컨텍스트 스택에서 제거하고 스택 꼭대기 실행 컨텍스트를 실행 중인 컨텍스트로 복원한다.
  7. callerContext 를 실행 중인 실행 컨텍스트로 둔다.
  8. callerContextNormalCompletion(iteratorResult) 를 전달하며 재개한다. genContext 가 다시 재개되면 resumptionValue 를 재개된 Completion Record 로 둔다.
  9. Assert: 여기 도달했다면 genContext 가 다시 실행 중인 실행 컨텍스트이다.
  10. resumptionValue 를 반환한다.

27.5.3.7 Yield ( value )

The abstract operation Yield takes argument value (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. generatorKindGetGeneratorKind() 로 둔다.
  2. generatorKindasync 이면 ? AsyncGeneratorYield(? Await(value)) 를 반환한다.
  3. 그렇지 않으면 ? GeneratorYield(CreateIteratorResultObject(value, false)) 를 반환한다.

27.5.3.8 CreateIteratorFromClosure ( closure, generatorBrand, generatorPrototype [ , extraSlots ] )

The abstract operation CreateIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:

  1. 주: closure 는 IteratorResult 객체를 산출하기 위해 Yield 연산을 사용할 수 있다.
  2. extraSlots 가 존재하지 않으면 새 빈 List 로 설정한다.
  3. internalSlotsListextraSlots 와 « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » 의 리스트 연결로 둔다.
  4. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) 로 둔다.
  5. generator.[[GeneratorBrand]]generatorBrand 로 설정한다.
  6. generator.[[GeneratorState]]suspended-start 로 설정한다.
  7. callerContext 를 실행 중인 실행 컨텍스트로 둔다.
  8. calleeContext 를 새로운 실행 컨텍스트로 둔다.
  9. calleeContext 의 Function 을 null 로 설정한다.
  10. calleeContextRealm 을 현재 Realm Record 로 설정한다.
  11. calleeContext 의 ScriptOrModule 을 callerContext 의 ScriptOrModule 로 설정한다.
  12. callerContext 가 이미 suspend 상태가 아니면 suspend 한다.
  13. calleeContext 를 실행 컨텍스트 스택에 push; 이제 calleeContext 가 실행 중인 실행 컨텍스트.
  14. GeneratorStart(generator, closure) 를 수행한다.
  15. calleeContext 를 실행 컨텍스트 스택에서 제거하고 callerContext 를 실행 중인 실행 컨텍스트로 복원한다.
  16. generator 를 반환한다.

27.6 AsyncGenerator 객체 (AsyncGenerator Objects)

AsyncGenerator 는 async 제너레이터 함수를 호출하여 생성되며 async 이터레이터 인터페이스와 async iterable 인터페이스를 모두 준수한다.

AsyncGenerator 인스턴스는 그것을 생성한 async 제너레이터 함수의 "prototype" 프로퍼티 초기 값으로부터 직접 프로퍼티를 상속한다. AsyncGenerator 인스턴스는 %AsyncGeneratorPrototype% 으로부터 간접적으로 프로퍼티를 상속한다.

27.6.1 %AsyncGeneratorPrototype% 객체 (The %AsyncGeneratorPrototype% Object)

%AsyncGeneratorPrototype% 객체:

  • %AsyncGeneratorFunction.prototype.prototype% 이다.
  • 일반 객체이다.
  • AsyncGenerator 인스턴스가 아니며 [[AsyncGeneratorState]] 내부 슬롯을 갖지 않는다.
  • [[Prototype]] 내부 슬롯 값이 %AsyncIteratorPrototype% 이다.
  • 모든 AsyncGenerator 인스턴스가 간접적으로 상속하는 프로퍼티들을 가진다.

27.6.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor 의 초기 값은 %AsyncGeneratorFunction.prototype% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.6.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. generatorthis 값으로 둔다.
  2. promiseCapability 를 ! NewPromiseCapability(%Promise%) 로 둔다.
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) 로 둔다.
  4. IfAbruptRejectPromise(result, promiseCapability).
  5. stategenerator.[[AsyncGeneratorState]] 로 둔다.
  6. statecompleted 이면,
    1. iteratorResultCreateIteratorResultObject(undefined, true) 로 둔다.
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») 를 수행한다.
    3. promiseCapability.[[Promise]] 를 반환한다.
  7. completionNormalCompletion(value) 로 둔다.
  8. AsyncGeneratorEnqueue(generator, completion, promiseCapability) 를 수행한다.
  9. statesuspended-start 또는 suspended-yield 이면,
    1. AsyncGeneratorResume(generator, completion) 를 수행한다.
  10. 그렇지 않으면,
    1. Assert: stateexecuting 또는 draining-queue.
  11. promiseCapability.[[Promise]] 를 반환한다.

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. generatorthis 값으로 둔다.
  2. promiseCapability 를 ! NewPromiseCapability(%Promise%) 로 둔다.
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) 로 둔다.
  4. IfAbruptRejectPromise(result, promiseCapability).
  5. completionReturnCompletion(value) 로 둔다.
  6. AsyncGeneratorEnqueue(generator, completion, promiseCapability) 를 수행한다.
  7. stategenerator.[[AsyncGeneratorState]] 로 둔다.
  8. statesuspended-start 또는 completed 이면
    1. generator.[[AsyncGeneratorState]]draining-queue 로 설정한다.
    2. AsyncGeneratorAwaitReturn(generator) 를 수행한다.
  9. Else if statesuspended-yield 이면
    1. AsyncGeneratorResume(generator, completion) 를 수행한다.
  10. 그렇지 않으면,
    1. Assert: stateexecuting 또는 draining-queue.
  11. promiseCapability.[[Promise]] 를 반환한다.

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis 값으로 둔다.
  2. promiseCapability 를 ! NewPromiseCapability(%Promise%) 로 둔다.
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) 로 둔다.
  4. IfAbruptRejectPromise(result, promiseCapability).
  5. stategenerator.[[AsyncGeneratorState]] 로 둔다.
  6. statesuspended-start 이면
    1. generator.[[AsyncGeneratorState]]completed 로 설정한다.
    2. statecompleted 로 설정한다.
  7. statecompleted 이면
    1. Call(promiseCapability.[[Reject]], undefined, « exception ») 를 수행한다.
    2. promiseCapability.[[Promise]] 를 반환한다.
  8. completionThrowCompletion(exception) 로 둔다.
  9. AsyncGeneratorEnqueue(generator, completion, promiseCapability) 를 수행한다.
  10. statesuspended-yield 이면
    1. AsyncGeneratorResume(generator, completion) 를 수행한다.
  11. 그렇지 않으면,
    1. Assert: stateexecuting 또는 draining-queue.
  12. promiseCapability.[[Promise]] 를 반환한다.

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "AsyncGenerator" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.6.2 AsyncGenerator 인스턴스의 프로퍼티 (Properties of AsyncGenerator Instances)

AsyncGenerator 인스턴스는 아래에 기술된 내부 슬롯을 가지고 초기화된다:

Table 92: AsyncGenerator 인스턴스의 내부 슬롯 (Internal Slots of AsyncGenerator Instances)
Internal Slot Type Description
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, or completed async 제너레이터의 현재 실행 상태.
[[AsyncGeneratorContext]] an execution context 이 async 제너레이터의 코드를 실행할 때 사용되는 실행 컨텍스트.
[[AsyncGeneratorQueue]] a List of AsyncGeneratorRequest Records async 제너레이터 재개 요청을 나타내는 레코드. 상태 전이 중을 제외하면 [[AsyncGeneratorState]]executing 또는 draining-queue 일 때 그리고 그 때에만 비어 있지 않다.
[[GeneratorBrand]] a String or empty 서로 다른 종류의 async 제너레이터를 구분하는 브랜드. ECMAScript 소스 텍스트로 선언된 async 제너레이터의 [[GeneratorBrand]] 는 항상 empty.

27.6.3 AsyncGenerator 추상 연산 (AsyncGenerator Abstract Operations)

27.6.3.1 AsyncGeneratorRequest 레코드 (AsyncGeneratorRequest Records)

AsyncGeneratorRequest 는 async 제너레이터를 어떻게 재개해야 하는지에 대한 정보를 저장하고 해당 promise 를 이행하거나 거부하기 위한 capability 를 포함하는 Record 값이다.

다음 필드를 가진다:

Table 93: AsyncGeneratorRequest Record Fields
Field Name Value Meaning
[[Completion]] a Completion Record async 제너레이터를 재개할 때 사용할 Completion Record.
[[Capability]] a PromiseCapability Record 이 요청과 연관된 promise capability.

27.6.3.2 AsyncGeneratorStart ( generator, generatorBody )

The abstract operation AsyncGeneratorStart takes arguments generator (an AsyncGenerator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start.
  2. genContext 를 실행 중인 실행 컨텍스트로 둔다.
  3. genContext 의 Generator 컴포넌트를 generator 로 설정한다.
  4. closure 를 매개변수 없고 generatorBody 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. acGenContext 를 실행 중인 실행 컨텍스트로 둔다.
    2. acGeneratoracGenContext 의 Generator 컴포넌트로 둔다.
    3. generatorBody 가 Parse Node 이면
      1. resultCompletion(Evaluation of generatorBody) 로 둔다.
    4. 그렇지 않으면
      1. Assert: generatorBody 는 매개변수 없는 Abstract Closure.
      2. resultCompletion(generatorBody()) 로 둔다.
    5. Assert: 여기로 돌아오면 async 제너레이터는 예외를 던졌거나 암시적 또는 명시적 return 을 수행한 것이다.
    6. acGenContext 를 실행 컨텍스트 스택에서 제거하고 스택 꼭대기 실행 컨텍스트를 실행 중인 컨텍스트로 복원한다.
    7. acGenerator.[[AsyncGeneratorState]]draining-queue 로 설정한다.
    8. resultnormal completion 이면 resultNormalCompletion(undefined) 로 설정한다.
    9. resultreturn completion 이면 resultNormalCompletion(result.[[Value]]) 로 설정한다.
    10. AsyncGeneratorCompleteStep(acGenerator, result, true) 를 수행한다.
    11. AsyncGeneratorDrainQueue(acGenerator) 를 수행한다.
    12. NormalCompletion(undefined) 를 반환한다.
  5. genContext 의 코드 평가 상태를 설정하여 그 실행 컨텍스트가 재개될 때 closure 가 인수 없이 호출되도록 한다.
  6. generator.[[AsyncGeneratorContext]]genContext 로 설정한다.
  7. generator.[[AsyncGeneratorQueue]] 를 새 빈 List 로 설정한다.
  8. unused 를 반환한다.

27.6.3.3 AsyncGeneratorValidate ( generator, generatorBrand )

The abstract operation AsyncGeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[AsyncGeneratorContext]]) 를 수행한다.
  2. RequireInternalSlot(generator, [[AsyncGeneratorState]]) 를 수행한다.
  3. RequireInternalSlot(generator, [[AsyncGeneratorQueue]]) 를 수행한다.
  4. generator.[[GeneratorBrand]]generatorBrand 와 다르면 TypeError 예외를 던진다.
  5. unused 를 반환한다.

27.6.3.4 AsyncGeneratorEnqueue ( generator, completion, promiseCapability )

The abstract operation AsyncGeneratorEnqueue takes arguments generator (an AsyncGenerator), completion (a Completion Record), and promiseCapability (a PromiseCapability Record) and returns unused. It performs the following steps when called:

  1. requestAsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } 로 둔다.
  2. requestgenerator.[[AsyncGeneratorQueue]] 에 추가한다.
  3. unused 를 반환한다.

27.6.3.5 AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )

The abstract operation AsyncGeneratorCompleteStep takes arguments generator (an AsyncGenerator), completion (a Completion Record), and done (a Boolean) and optional argument realm (a Realm Record) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorQueue]] 는 비어 있지 않다.
  2. nextgenerator.[[AsyncGeneratorQueue]] 의 첫 번째 요소로 둔다.
  3. 첫 번째 요소를 generator.[[AsyncGeneratorQueue]] 에서 제거한다.
  4. promiseCapabilitynext.[[Capability]] 로 둔다.
  5. valuecompletion.[[Value]] 로 둔다.
  6. completionthrow completion 이면,
    1. Call(promiseCapability.[[Reject]], undefined, « value ») 를 수행한다.
  7. 그렇지 않으면,
    1. Assert: completionnormal completion.
    2. realm 이 존재하면,
      1. oldRealm 을 실행 중인 실행 컨텍스트의 Realm 으로 둔다.
      2. 실행 중인 실행 컨텍스트의 Realmrealm 으로 설정한다.
      3. iteratorResultCreateIteratorResultObject(value, done) 로 둔다.
      4. 실행 중인 실행 컨텍스트의 RealmoldRealm 으로 되돌린다.
    3. 그렇지 않으면,
      1. iteratorResultCreateIteratorResultObject(value, done) 로 둔다.
    4. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») 를 수행한다.
  8. unused 를 반환한다.

27.6.3.6 AsyncGeneratorResume ( generator, completion )

The abstract operation AsyncGeneratorResume takes arguments generator (an AsyncGenerator) and completion (a Completion Record) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start 또는 suspended-yield.
  2. genContextgenerator.[[AsyncGeneratorContext]] 로 둔다.
  3. callerContext 를 실행 중인 실행 컨텍스트로 둔다.
  4. callerContext 를 suspend 한다.
  5. generator.[[AsyncGeneratorState]]executing 으로 설정한다.
  6. genContext 를 실행 컨텍스트 스택에 push; 이제 genContext 가 실행 중인 실행 컨텍스트.
  7. genContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 completion 을 사용한다. result 를 재개된 계산이 반환한 Completion Record 로 둔다.
  8. Assert: result 는 절대 abrupt completion 이 아니다.
  9. Assert: 여기로 돌아오면 genContext 는 이미 실행 컨텍스트 스택에서 제거되었고 callerContext 가 현재 실행 컨텍스트이다.
  10. unused 를 반환한다.

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. resumptionValuereturn completion 이 아니면 ? resumptionValue 를 반환한다.
  2. awaitedCompletion(Await(resumptionValue.[[Value]])) 로 둔다.
  3. awaitedthrow completion 이면 ? awaited 를 반환한다.
  4. Assert: awaitednormal completion.
  5. ReturnCompletion(awaited.[[Value]]) 를 반환한다.

27.6.3.8 AsyncGeneratorYield ( value )

The abstract operation AsyncGeneratorYield takes argument value (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. genContext 를 실행 중인 실행 컨텍스트로 둔다.
  2. Assert: genContext 는 제너레이터의 실행 컨텍스트.
  3. generatorgenContext 의 Generator 컴포넌트 값으로 둔다.
  4. Assert: GetGeneratorKind() 는 async.
  5. completionNormalCompletion(value) 로 둔다.
  6. Assert: 실행 컨텍스트 스택은 최소 두 개의 요소를 가진다.
  7. previousContext 를 실행 컨텍스트 스택의 위에서 두 번째 요소로 둔다.
  8. previousRealmpreviousContextRealm 으로 둔다.
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm) 를 수행한다.
  10. queuegenerator.[[AsyncGeneratorQueue]] 로 둔다.
  11. queue 가 비어 있지 않으면,
    1. 주: 제너레이터를 suspend 하지 않고 실행을 계속한다.
    2. toYieldqueue 의 첫 요소로 둔다.
    3. resumptionValueCompletion(toYield.[[Completion]]) 로 둔다.
    4. AsyncGeneratorUnwrapYieldResumption(resumptionValue) 를 반환한다.
  12. 그렇지 않으면,
    1. generator.[[AsyncGeneratorState]]suspended-yield 로 설정한다.
    2. genContext 를 실행 컨텍스트 스택에서 제거하고 스택 꼭대기 실행 컨텍스트를 실행 중인 컨텍스트로 복원한다.
    3. callerContext 를 실행 중인 실행 컨텍스트로 둔다.
    4. callerContextundefined 를 전달하며 재개한다. genContext 가 다시 재개되면 resumptionValue 를 그 재개에 사용된 Completion Record 로 둔다.
    5. Assert: 여기 도달하면 genContext 가 다시 실행 중인 실행 컨텍스트이다.
    6. AsyncGeneratorUnwrapYieldResumption(resumptionValue) 를 반환한다.

27.6.3.9 AsyncGeneratorAwaitReturn ( generator )

The abstract operation AsyncGeneratorAwaitReturn takes argument generator (an AsyncGenerator) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue.
  2. queuegenerator.[[AsyncGeneratorQueue]] 로 둔다.
  3. Assert: queue 는 비어 있지 않다.
  4. nextqueue 의 첫 요소로 둔다.
  5. completionCompletion(next.[[Completion]]) 로 둔다.
  6. Assert: completionreturn completion.
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]])) 로 둔다.
  8. promiseCompletionabrupt completion 이면,
    1. AsyncGeneratorCompleteStep(generator, promiseCompletion, true) 를 수행한다.
    2. AsyncGeneratorDrainQueue(generator) 를 수행한다.
    3. unused 를 반환한다.
  9. Assert: promiseCompletionnormal completion.
  10. promisepromiseCompletion.[[Value]] 로 둔다.
  11. fulfilledClosure 를 매개변수 (value) 를 가지고 generator 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue.
    2. resultNormalCompletion(value) 로 둔다.
    3. AsyncGeneratorCompleteStep(generator, result, true) 를 수행한다.
    4. AsyncGeneratorDrainQueue(generator) 를 수행한다.
    5. NormalCompletion(undefined) 를 반환한다.
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») 로 둔다.
  13. rejectedClosure 를 매개변수 (reason) 를 가지고 generator 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue.
    2. resultThrowCompletion(reason) 로 둔다.
    3. AsyncGeneratorCompleteStep(generator, result, true) 를 수행한다.
    4. AsyncGeneratorDrainQueue(generator) 를 수행한다.
    5. NormalCompletion(undefined) 를 반환한다.
  14. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») 로 둔다.
  15. PerformPromiseThen(promise, onFulfilled, onRejected) 를 수행한다.
  16. unused 를 반환한다.

27.6.3.10 AsyncGeneratorDrainQueue ( generator )

The abstract operation AsyncGeneratorDrainQueue takes argument generator (an AsyncGenerator) and returns unused. return completion 을 보유한 AsyncGeneratorRequest 를 만날 때까지 제너레이터의 AsyncGeneratorQueue 를 비운다. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue.
  2. queuegenerator.[[AsyncGeneratorQueue]] 로 둔다.
  3. 반복, queue 가 비어 있지 않은 동안,
    1. nextqueue 의 첫 요소로 둔다.
    2. completionCompletion(next.[[Completion]]) 로 둔다.
    3. completionreturn completion 이면,
      1. AsyncGeneratorAwaitReturn(generator) 를 수행한다.
      2. unused 를 반환한다.
    4. 그렇지 않으면,
      1. completionnormal completion 이면
        1. completionNormalCompletion(undefined) 로 설정한다.
      2. AsyncGeneratorCompleteStep(generator, completion, true) 를 수행한다.
  4. generator.[[AsyncGeneratorState]]completed 로 설정한다.
  5. unused 를 반환한다.

27.6.3.11 CreateAsyncIteratorFromClosure ( closure, generatorBrand, generatorPrototype )

The abstract operation CreateAsyncIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and returns an AsyncGenerator. It performs the following steps when called:

  1. NOTE: closureAwait 연산과 IteratorResult 객체를 산출하기 위한 Yield 연산을 포함할 수 있다.
  2. internalSlotsList 를 « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] » 로 둔다.
  3. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) 로 둔다.
  4. generator.[[GeneratorBrand]]generatorBrand 로 설정한다.
  5. generator.[[AsyncGeneratorState]]suspended-start 로 설정한다.
  6. callerContext 를 실행 중인 실행 컨텍스트로 둔다.
  7. calleeContext 를 새로운 실행 컨텍스트로 둔다.
  8. calleeContext 의 Function 을 null 로 설정한다.
  9. calleeContextRealm 을 현재 Realm Record 로 설정한다.
  10. calleeContext 의 ScriptOrModule 을 callerContext 의 ScriptOrModule 로 설정한다.
  11. callerContext 가 이미 suspend 상태가 아니면 suspend 한다.
  12. calleeContext 를 실행 컨텍스트 스택에 push; 이제 calleeContext 가 실행 중인 실행 컨텍스트.
  13. AsyncGeneratorStart(generator, closure) 를 수행한다.
  14. calleeContext 를 실행 컨텍스트 스택에서 제거하고 callerContext 를 실행 중인 실행 컨텍스트로 복원한다.
  15. generator 를 반환한다.

27.7 AsyncFunction 객체 (AsyncFunction Objects)

AsyncFunction 들은 보통 AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncMethod, AsyncArrowFunction 을 평가하여 생성되는 함수들이다. 또한 %AsyncFunction% 내재를 호출하여 생성될 수도 있다.

27.7.1 AsyncFunction 생성자 (The AsyncFunction Constructor)

AsyncFunction 생성자는 다음과 같다:

  • %AsyncFunction% 이다.
  • Function 의 서브클래스이다.
  • 생성자가 아니라 함수로 호출될 때 새 AsyncFunction 을 생성하고 초기화한다. 따라서 함수 호출 AsyncFunction(…) 은 동일한 인수의 new AsyncFunction(…) 객체 생성 표현식과 동등하다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 AsyncFunction 동작을 상속하려는 서브클래스 생성자는 내장 async 함수 동작에 필요한 내부 슬롯을 갖춘 서브클래스 인스턴스를 생성·초기화하기 위해 AsyncFunction 생성자에 대한 super 호출을 포함해야 한다. async 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 AsyncFunction 의 직접 인스턴스를 생성한다. AsyncFunction 서브클래스 인스턴스를 만들 수 있는 문법적 수단은 없다.

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 async 함수의 본문(실행 코드)을 지정한다. 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출될 때 다음 단계를 수행한다:

  1. C 를 활성 함수 객체로 둔다.
  2. bodyArg 가 존재하지 않으면 bodyArg 를 빈 문자열로 설정한다.
  3. CreateDynamicFunction(C, NewTarget, async, parameterArgs, bodyArg) 를 반환한다.
Note
20.2.1.1 의 NOTE 참조.

27.7.2 AsyncFunction 생성자의 프로퍼티 (Properties of the AsyncFunction Constructor)

AsyncFunction 생성자는 다음과 같다:

  • Function 생성자로부터 상속하는 표준 내장 함수 객체이다.
  • [[Prototype]] 내부 슬롯 값이 %Function% 이다.
  • "length" 프로퍼티 값이 1𝔽 이다.
  • "name" 프로퍼티 값이 "AsyncFunction" 이다.
  • 다음 프로퍼티들을 가진다:

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype 의 초기 값은 AsyncFunction 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

27.7.3 AsyncFunction 프로토타입 객체의 프로퍼티 (Properties of the AsyncFunction Prototype Object)

AsyncFunction 프로토타입 객체:

27.7.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor 의 초기 값은 %AsyncFunction% 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "AsyncFunction" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

27.7.4 AsyncFunction 인스턴스 (AsyncFunction Instances)

모든 AsyncFunction 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 열거된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false 이다. AsyncFunction 인스턴스는 생성자가 아니며 [[Construct]] 내부 메서드를 갖지 않는다. AsyncFunction 인스턴스는 생성 불가능하므로 prototype 프로퍼티를 갖지 않는다.

각 AsyncFunction 인스턴스는 다음 자체 프로퍼티를 가진다:

27.7.4.1 length

20.2.4.1 에 기술된 Function 인스턴스 "length" 프로퍼티 명세는 AsyncFunction 인스턴스에도 적용된다.

27.7.4.2 name

20.2.4.2 에 기술된 Function 인스턴스 "name" 프로퍼티 명세는 AsyncFunction 인스턴스에도 적용된다.

27.7.5 Async 함수 추상 연산 (Async Functions Abstract Operations)

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

The abstract operation AsyncFunctionStart takes arguments promiseCapability (a PromiseCapability Record) and asyncFunctionBody (a FunctionBody Parse Node, an ExpressionBody Parse Node, or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. runningContext 를 실행 중인 실행 컨텍스트로 둔다.
  2. asyncContextrunningContext 의 복사본으로 둔다.
  3. NOTE: 실행 상태 복사는 AsyncBlockStart 가 그 실행을 재개하기 위해 필요하다. 현재 실행 중인 컨텍스트를 재개하는 것은 잘 정의되지 않는다.
  4. AsyncBlockStart(promiseCapability, asyncFunctionBody, asyncContext) 를 수행한다.
  5. unused 를 반환한다.

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

The abstract operation AsyncBlockStart takes arguments promiseCapability (a PromiseCapability Record), asyncBody (a Parse Node or an Abstract Closure with no parameters), and asyncContext (an execution context) and returns unused. It performs the following steps when called:

  1. runningContext 를 실행 중인 실행 컨텍스트로 둔다.
  2. closure 를 매개변수 없고 promiseCapability, asyncBody 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. acAsyncContext 를 실행 중인 실행 컨텍스트로 둔다.
    2. asyncBody 가 Parse Node 이면
      1. resultCompletion(Evaluation of asyncBody) 로 둔다.
    3. 그렇지 않으면
      1. Assert: asyncBody 는 매개변수 없는 Abstract Closure.
      2. resultCompletion(asyncBody()) 로 둔다.
    4. Assert: 여기로 돌아오면 async 함수는 예외를 던졌거나 암시적 또는 명시적 return 을 수행했고 모든 await 가 완료되었다.
    5. acAsyncContext 를 실행 컨텍스트 스택에서 제거하고 스택 꼭대기 실행 컨텍스트를 실행 중인 컨텍스트로 복원한다.
    6. resultnormal completion 이면
      1. Call(promiseCapability.[[Resolve]], undefined, « undefined ») 를 수행한다.
    7. Else if resultreturn completion 이면
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») 를 수행한다.
    8. Else,
      1. Assert: resultthrow completion.
      2. Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») 를 수행한다.
    9. NormalCompletion(unused) 를 반환한다.
  3. asyncContext 의 코드 평가 상태를 설정하여 그 실행 컨텍스트가 재개될 때 closure 가 인수 없이 호출되도록 한다.
  4. asyncContext 를 실행 컨텍스트 스택에 push; 이제 asyncContext 가 실행 중인 실행 컨텍스트.
  5. asyncContext 의 중단된 평가를 재개 한다. result 를 재개된 계산이 반환한 값으로 둔다.
  6. Assert: 여기로 돌아오면 asyncContext 는 이미 실행 컨텍스트 스택에서 제거되었고 runningContext 가 현재 실행 컨텍스트이다.
  7. Assert: result 는 값이 unusednormal completion. 이 값의 가능한 출처는 Await 이거나, async 함수가 어떤 것도 await 하지 않는 경우 위 2.i 단계이다.
  8. unused 를 반환한다.

27.7.5.3 Await ( value )

The abstract operation Await takes argument value (an ECMAScript language value) and returns either a normal completion containing either an ECMAScript language value or empty, or a throw completion. It performs the following steps when called:

  1. asyncContext 를 실행 중인 실행 컨텍스트로 둔다.
  2. promise 를 ? PromiseResolve(%Promise%, value) 로 둔다.
  3. fulfilledClosure 를 매개변수 (v) 를 가지고 asyncContext 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. prevContext 를 실행 중인 실행 컨텍스트로 둔다.
    2. prevContext 를 suspend 한다.
    3. asyncContext 를 실행 컨텍스트 스택에 push; 이제 asyncContext 가 실행 중인 실행 컨텍스트.
    4. asyncContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 NormalCompletion(v) 를 사용한다.
    5. Assert: 이 단계에 도달하면 asyncContext 는 이미 실행 컨텍스트 스택에서 제거되었고 prevContext 가 현재 실행 컨텍스트이다.
    6. NormalCompletion(undefined) 를 반환한다.
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») 로 둔다.
  5. rejectedClosure 를 매개변수 (reason) 를 가지고 asyncContext 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
    1. prevContext 를 실행 중인 실행 컨텍스트로 둔다.
    2. prevContext 를 suspend 한다.
    3. asyncContext 를 실행 컨텍스트 스택에 push; 이제 asyncContext 가 실행 중인 실행 컨텍스트.
    4. asyncContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 ThrowCompletion(reason) 를 사용한다.
    5. Assert: 이 단계에 도달하면 asyncContext 는 이미 실행 컨텍스트 스택에서 제거되었고 prevContext 가 현재 실행 컨텍스트이다.
    6. NormalCompletion(undefined) 를 반환한다.
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») 로 둔다.
  7. PerformPromiseThen(promise, onFulfilled, onRejected) 를 수행한다.
  8. asyncContext 를 실행 컨텍스트 스택에서 제거하고 스택 꼭대기 실행 컨텍스트를 실행 중인 컨텍스트로 복원한다.
  9. callerContext 를 실행 중인 실행 컨텍스트로 둔다.
  10. callerContextempty 를 전달하며 재개한다. asyncContext 가 다시 재개되면 completion 을 그 재개에 사용된 Completion Record 로 둔다.
  11. Assert: 여기 도달하면 asyncContext 가 다시 실행 중인 실행 컨텍스트이다.
  12. completion 을 반환한다.