27 제어 추상화 객체

27.1 반복

27.1.1 공통 반복 인터페이스

인터페이스는 관련 값이 특정 명세와 일치하는 프로퍼티 키의 집합이다. 인터페이스의 명세에 설명된 모든 프로퍼티를 제공하는 모든 객체는 그 인터페이스를 준수한다. 인터페이스는 별개의 객체로 표현되지 않는다. 어떤 인터페이스를 준수하는 객체는 별도로 구현된 것이 많이 있을 수 있다. 개별 객체는 여러 인터페이스를 준수할 수 있다.

27.1.1.1 Iterable 인터페이스

iterable 인터페이스Table 78에 설명된 프로퍼티를 포함한다:

Table 78: Iterable 인터페이스 필수 프로퍼티
프로퍼티 요구 사항
%Symbol.iterator% iterator 객체를 반환하는 함수 반환된 객체는 iterator 인터페이스를 준수해야 한다.

27.1.1.2 Iterator 인터페이스

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

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

next 함수에 인자를 전달할 수 있지만, 그 해석과 유효성은 대상 iterator에 따라 달라진다. for-of 문과 iterator의 다른 일반적인 사용자는 어떤 인자도 전달하지 않으므로, 그러한 방식으로 사용될 것으로 예상하는 iterator 객체는 인자 없이 호출되는 경우를 처리할 준비가 되어 있어야 한다.

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

일반적으로 이러한 메서드의 호출자는 호출하기 전에 그 존재 여부를 확인해야 한다. for-of, yield*, 배열 구조 분해를 포함한 특정 ECMAScript 언어 기능은 존재 여부 확인을 수행한 뒤 이러한 메서드를 호출한다. iterable 객체를 인자로 받는 대부분의 ECMAScript 라이브러리 함수도 이를 조건부로 호출한다.

27.1.1.3 Async Iterable 인터페이스

async iterable 인터페이스Table 81에 설명된 프로퍼티를 포함한다:

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

27.1.1.4 Async Iterator 인터페이스

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

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

반환된 promise는 이행될 때 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 83: Async Iterator 인터페이스 선택 프로퍼티
프로퍼티 요구 사항
"return" IteratorResult 객체에 대한 promise를 반환하는 함수

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

추가로, 이행 값으로 쓰이는 IteratorResult 객체는 값이 promise(또는 "thenable")가 아닌 "value" 프로퍼티를 가져야 한다. 인자 값이 전형적인 방식으로 사용된다면, 그것이 거부된 promise인 경우 같은 이유로 거부된 promise가 반환되어야 하며, 그것이 이행된 promise인 경우 그 이행 값이 반환된 promise의 IteratorResult 객체 이행 값의 "value" 프로퍼티로 사용되어야 한다. 그러나 이러한 요구 사항도 강제되지 않는다.

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

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

반환된 promise가 이행되면, IteratorResult 객체 이행 값은 일반적으로 값이 true"done" 프로퍼티를 가진다. 추가로, 값이 promise(또는 "thenable")가 아닌 "value" 프로퍼티를 가져야 하지만, 이 요구 사항은 강제되지 않는다.

Note 2

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

27.1.1.5 IteratorResult 인터페이스

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

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

27.1.2 Iterator Helper 객체

Iterator Helper 객체는 어떤 특정 소스 iterator 객체의 지연 변환을 나타내는 ordinary object이다. Iterator Helper 객체에는 이름이 있는 생성자가 없다. 대신, Iterator Helper 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성된다.

27.1.2.1 %IteratorHelperPrototype% 객체

%IteratorHelperPrototype% 객체:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

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

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. objthis value로 둔다.
  2. RequireInternalSlot(obj, [[UnderlyingIterators]])를 수행한다.
  3. Assert: obj[[GeneratorState]] 내부 슬롯을 가진다.
  4. obj.[[GeneratorState]]suspended-start이면,
    1. obj.[[GeneratorState]]completed로 설정한다.
    2. NOTE: generator가 completed 상태에 들어가면 그 상태를 결코 떠나지 않으며 관련 실행 컨텍스트는 다시 재개되지 않는다. obj와 관련된 모든 실행 상태는 이 시점에서 폐기될 수 있다.
    3. IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused))를 수행한다.
    4. CreateIteratorResultObject(undefined, true)를 반환한다.
  5. completionReturnCompletion(undefined)으로 둔다.
  6. GeneratorResumeAbrupt(obj, completion, "Iterator Helper")를 반환한다.

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

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

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

27.1.3 Iterator 객체

27.1.3.1 Iterator 생성자

Iterator 생성자:

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

27.1.3.1.1 Iterator ( )

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

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

27.1.3.2 Iterator 생성자의 프로퍼티

Iterator 생성자:

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

27.1.3.2.1 Iterator.concat ( ...items )

  1. iterables를 새로운 빈 List로 둔다.
  2. items의 각 요소 item에 대해, 다음을 수행한다
    1. item이 Object가 아니면, TypeError 예외를 던진다.
    2. method를 ? GetMethod(item, %Symbol.iterator%)로 둔다.
    3. methodundefined이면, TypeError 예외를 던진다.
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item }을 iterables에 추가한다.
  3. iterables를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure를 둔다:
    1. iterables의 각 Record iterable에 대해, 다음을 수행한다
      1. iter를 ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]])로 둔다.
      2. iter가 Object가 아니면, TypeError 예외를 던진다.
      3. iteratorRecord를 ? GetIteratorDirect(iter)로 둔다.
      4. innerAlivetrue로 둔다.
      5. innerAlivetrue인 동안 반복한다,
        1. innerValue를 ? IteratorStepValue(iteratorRecord)로 둔다.
        2. innerValuedone이면,
          1. innerAlivefalse로 설정한다.
        3. 그렇지 않으면,
          1. completionCompletion(Yield(innerValue))로 둔다.
          2. completionabrupt completion이면,
            1. IteratorClose(iteratorRecord, completion)를 반환한다.
    2. ReturnCompletion(undefined)를 반환한다.
  4. genCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둔다.
  5. gen.[[UnderlyingIterators]]를 새로운 빈 List로 설정한다.
  6. gen을 반환한다.

27.1.3.2.2 Iterator.from ( obj )

  1. iteratorRecord를 ? GetIteratorFlattenable(obj, 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.2.1 %WrapForValidIteratorPrototype% 객체

%WrapForValidIteratorPrototype% 객체:

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. objthis value로 둔다.
  2. RequireInternalSlot(obj, [[Iterated]])를 수행한다.
  3. iteratorRecordobj.[[Iterated]]로 둔다.
  4. Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])를 반환한다.

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. objthis value로 둔다.
  2. RequireInternalSlot(obj, [[Iterated]])를 수행한다.
  3. iteratorobj.[[Iterated]].[[Iterator]]로 둔다.
  4. Assert: iterator는 Object이다.
  5. returnMethod를 ? GetMethod(iterator, "return")로 둔다.
  6. returnMethodundefined이면,
    1. CreateIteratorResultObject(undefined, true)를 반환한다.
  7. Call(returnMethod, iterator)를 반환한다.

27.1.3.2.3 Iterator.prototype

Iterator.prototype의 초기 값은 Iterator prototype object이다.

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

27.1.3.3 Iterator Prototype Object의 프로퍼티

Iterator prototype object:

Note

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

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

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

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructor는 속성 { [[Enumerable]]: false, [[Configurable]]: true }를 가진 accessor property이다. [[Get]][[Set]] 속성은 다음과 같이 정의된다:

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Get]] 속성의 값은 인자를 필요로 하지 않는 built-in function이다. 호출될 때 다음 단계를 수행한다:

  1. %Iterator%를 반환한다.

27.1.3.3.1.2 set Iterator.prototype.constructor

[[Set]] 속성의 값은 인자 v를 받는 built-in function이다. 호출될 때 다음 단계를 수행한다:

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

대부분의 built-in prototype의 "constructor" 프로퍼티와 달리, 웹 호환성상의 이유로 이 프로퍼티는 accessor여야 한다.

27.1.3.3.2 Iterator.prototype.drop ( limit )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[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(obj)로 설정한다.
  10. iteratedintegerLimit를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure를 둔다:
    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%, « [[UnderlyingIterators]] »)로 둔다.
  12. result.[[UnderlyingIterators]]를 « iterated »로 설정한다.
  13. result를 반환한다.

27.1.3.3.3 Iterator.prototype.every ( predicate )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  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.3.3.4 Iterator.prototype.filter ( predicate )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  6. iteratedpredicate를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure를 둔다:
    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%, « [[UnderlyingIterators]] »)로 둔다.
  8. result.[[UnderlyingIterators]]를 « iterated »로 설정한다.
  9. result를 반환한다.

27.1.3.3.5 Iterator.prototype.find ( predicate )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  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.3.3.6 Iterator.prototype.flatMap ( mapper )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(mapper)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  6. iteratedmapper를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure를 둔다:
    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%, « [[UnderlyingIterators]] »)로 둔다.
  8. result.[[UnderlyingIterators]]를 « iterated »로 설정한다.
  9. result를 반환한다.

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(procedure)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  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.3.3.8 Iterator.prototype.map ( mapper )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(mapper)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  6. iteratedmapper를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure를 둔다:
    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%, « [[UnderlyingIterators]] »)로 둔다.
  8. result.[[UnderlyingIterators]]를 « iterated »로 설정한다.
  9. result를 반환한다.

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

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(reducer)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  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.3.3.10 Iterator.prototype.some ( predicate )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성된 TypeError 객체)로 둔다.
    2. IteratorClose(iterated, error)를 반환한다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  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.3.3.11 Iterator.prototype.take ( limit )

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

  1. objthis value로 둔다.
  2. obj가 Object가 아니면, TypeError 예외를 던진다.
  3. iteratedIterator Record { [[Iterator]]: obj, [[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(obj)로 설정한다.
  10. iteratedintegerLimit를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure를 둔다:
    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%, « [[UnderlyingIterators]] »)로 둔다.
  12. result.[[UnderlyingIterators]]를 « iterated »로 설정한다.
  13. result를 반환한다.

27.1.3.3.12 Iterator.prototype.toArray ( )

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

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

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

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

  1. this value를 반환한다.

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

27.1.3.3.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%]는 속성 { [[Enumerable]]: false, [[Configurable]]: true }를 가진 accessor property이다. [[Get]][[Set]] 속성은 다음과 같이 정의된다:

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

[[Get]] 속성의 값은 인자를 필요로 하지 않는 built-in function이다. 호출될 때 다음 단계를 수행한다:

  1. "Iterator"를 반환한다.

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

[[Set]] 속성의 값은 인자 v를 받는 built-in function이다. 호출될 때 다음 단계를 수행한다:

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

대부분의 built-in prototype의 %Symbol.toStringTag% 프로퍼티와 달리, 웹 호환성상의 이유로 이 프로퍼티는 accessor여야 한다.

27.1.4 %AsyncIteratorPrototype% 객체

%AsyncIteratorPrototype% 객체:

Note

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

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

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

  1. this value를 반환한다.

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

27.1.5 Async-from-Sync Iterator 객체

Async-from-Sync Iterator 객체는 특정 동기 iterator를 적응시키는 async iterator이다. Async-from-Sync Iterator 객체는 ECMAScript 코드에서 직접 접근할 수 없다. Async-from-Sync Iterator 객체에는 이름이 있는 생성자가 없다. 대신, Async-from-Sync Iterator 객체는 필요에 따라 CreateAsyncFromSyncIterator abstract operation에 의해 생성된다.

27.1.5.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.5.2 %AsyncFromSyncIteratorPrototype% 객체

%AsyncFromSyncIteratorPrototype% 객체:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. objthis value로 둔다.
  2. Assert: obj[[SyncIteratorRecord]] 내부 슬롯을 가진 Object이다.
  3. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둔다.
  4. syncIteratorRecordobj.[[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.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. objthis value로 둔다.
  2. Assert: obj[[SyncIteratorRecord]] 내부 슬롯을 가진 Object이다.
  3. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둔다.
  4. syncIteratorRecordobj.[[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.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
이 명세에서 value는 항상 제공되지만, %AsyncFromSyncIteratorPrototype%.return ( [ value ] )와의 일관성을 위해 선택 사항으로 남겨져 있다.
  1. objthis value로 둔다.
  2. Assert: obj[[SyncIteratorRecord]] 내부 슬롯을 가진 Object이다.
  3. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둔다.
  4. syncIteratorRecordobj.[[SyncIteratorRecord]]로 둔다.
  5. syncIteratorsyncIteratorRecord.[[Iterator]]로 둔다.
  6. throwCompletion(GetMethod(syncIterator, "throw"))로 둔다.
  7. IfAbruptRejectPromise(throw, promiseCapability).
  8. throwundefined이면,
    1. NOTE: syncIteratorthrow 메서드가 없으면, capability를 거부하기 전에 정리할 기회를 주기 위해 이를 닫는다.
    2. closeCompletionNormalCompletion(empty)으로 둔다.
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion))로 둔다.
    4. IfAbruptRejectPromise(result, promiseCapability).
    5. NOTE: 다음 단계는 프로토콜 위반이 있었음을 나타내기 위해 TypeError를 던진다: syncIteratorthrow 메서드가 없다.
    6. NOTE: 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.5.3 Async-from-Sync Iterator 인스턴스의 프로퍼티

Async-from-Sync Iterator 인스턴스는 %AsyncFromSyncIteratorPrototype% intrinsic object에서 프로퍼티를 상속하는 ordinary object이다. Async-from-Sync Iterator 인스턴스는 처음에 Table 85에 나열된 내부 슬롯을 가지고 생성된다.

Table 85: Async-from-Sync Iterator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[SyncIteratorRecord]] Iterator Record 적응 중인 원래 동기 iterator를 나타낸다.

27.1.5.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. NOTE: promiseCapability은 intrinsic %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. done을 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (v)를 가진 새로운 Abstract Closureunwrap을 둔다:
    1. CreateIteratorResultObject(v, done)를 반환한다.
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « »)로 둔다.
  11. NOTE: onFulfilled는 IteratorResult 객체의 "value" 프로퍼티를 처리할 때, 그 값이 promise인 경우 이를 기다리고 그 결과를 새로운 "unwrapped" IteratorResult 객체에 다시 포장하기 위해 사용된다.
  12. donetrue이거나 closeOnRejectionfalse이면,
    1. onRejectedundefined로 둔다.
  13. 그렇지 않으면,
    1. syncIteratorRecord를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (error)를 가진 새로운 Abstract ClosurecloseIterator를 둔다:
      1. IteratorClose(syncIteratorRecord, ThrowCompletion(error))를 반환한다.
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « »)로 둔다.
    3. NOTE: onRejected는 IteratorResult 객체가 산출한 "value" 프로퍼티가 거부된 promise일 때 Iterator를 닫는 데 사용된다.
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)를 수행한다.
  15. promiseCapability.[[Promise]]를 반환한다.

27.2 Promise 객체

Promise는 지연된(그리고 가능하게는 비동기적인) 계산의 최종 결과를 위한 자리표시자로 사용되는 객체이다.

모든 Promise는 서로 배타적인 세 상태 중 하나에 있다: fulfilled, rejected, 그리고 pending:

  • promise pp.then(f, r)이 함수 f를 호출하는 Job을 즉시 큐에 넣는다면 fulfilled이다.
  • promise pp.then(f, r)이 함수 r을 호출하는 Job을 즉시 큐에 넣는다면 rejected이다.
  • promise는 fulfilled도 rejected도 아니라면 pending이다.

promise는 pending이 아니면, 즉 fulfilled이거나 rejected이면 settled되었다고 한다.

promise는 settled되었거나 다른 promise의 상태와 일치하도록 “고정”되었다면 resolved되었다. resolved promise를 resolve하거나 reject하려는 시도는 아무 효과가 없다. promise는 resolved가 아니면 unresolved이다. unresolved promise는 항상 pending 상태에 있다. resolved promise는 pending, fulfilled 또는 rejected일 수 있다.

27.2.1 Promise 추상 연산

27.2.1.1 PromiseCapability 레코드

PromiseCapability 레코드는 Promise 또는 promise-like 객체를 그 promise를 resolve하거나 reject할 수 있는 함수들과 함께 캡슐화하는 데 사용되는 Record 값이다. PromiseCapability 레코드는 NewPromiseCapability 추상 연산에 의해 생성된다.

PromiseCapability 레코드는 Table 86에 나열된 필드를 가진다.

Table 86: PromiseCapability 레코드 필드
필드 이름 의미
[[Promise]] Object promise로 사용할 수 있는 객체.
[[Resolve]] 함수 객체 주어진 promise를 resolve하는 데 사용되는 함수.
[[Reject]] 함수 객체 주어진 promise를 reject하는 데 사용되는 함수.

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise는 PromiseCapability 레코드를 사용하는 일련의 알고리즘 단계에 대한 축약 표기이다. 다음 형식의 알고리즘 단계:

  1. IfAbruptRejectPromise(value, capability).

는 다음과 같은 의미이다:

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

27.2.1.2 PromiseReaction 레코드

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

PromiseReaction 레코드는 Table 87에 나열된 필드를 가진다.

Table 87: PromiseReaction 레코드 필드
필드 이름 의미
[[Capability]] PromiseCapability 레코드 또는 undefined 이 레코드가 reaction handler를 제공하는 promise의 capability.
[[Type]] fulfill 또는 reject [[Type]][[Handler]]empty일 때 settlement 타입에 특정한 동작을 허용하기 위해 사용된다.
[[Handler]] JobCallback 레코드 또는 empty 들어오는 값에 적용되어야 하는 함수이며, 그 반환 값은 파생 promise에 일어날 일을 결정한다. [[Handler]]empty이면, 대신 [[Type]]의 값에 의존하는 함수가 사용된다.

27.2.1.3 CreateResolvingFunctions ( toResolve )

The abstract operation CreateResolvingFunctions takes argument toResolve (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. promiseOrEmptyRecord { [[Value]]: toResolve }로 둔다.
  2. resolveStepspromiseOrEmpty를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (resolution)를 가진 새로운 Abstract Closure로 둔다:
    1. promiseOrEmpty.[[Value]]empty이면, undefined를 반환한다.
    2. promisepromiseOrEmpty.[[Value]]로 둔다.
    3. promiseOrEmpty.[[Value]]empty로 설정한다.
    4. SameValue(resolution, promise)가 true이면,
      1. selfResolutionError를 새로 생성된 TypeError 객체로 둔다.
      2. RejectPromise(promise, selfResolutionError)를 수행한다.
      3. undefined를 반환한다.
    5. resolution이 Object가 아니면,
      1. FulfillPromise(promise, resolution)를 수행한다.
      2. undefined를 반환한다.
    6. thenCompletion(Get(resolution, "then"))으로 둔다.
    7. thenabrupt completion이면,
      1. RejectPromise(promise, then.[[Value]])를 수행한다.
      2. undefined를 반환한다.
    8. thenActionthen.[[Value]]로 둔다.
    9. IsCallable(thenAction)가 false이면,
      1. FulfillPromise(promise, resolution)를 수행한다.
      2. undefined를 반환한다.
    10. thenJobCallbackHostMakeJobCallback(thenAction)으로 둔다.
    11. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback)으로 둔다.
    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])을 수행한다.
    13. undefined를 반환한다.
  3. resolveCreateBuiltinFunction(resolveSteps, 1, "", « »)로 둔다.
  4. rejectStepspromiseOrEmpty를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (reason)를 가진 새로운 Abstract Closure로 둔다:
    1. promiseOrEmpty.[[Value]]empty이면, undefined를 반환한다.
    2. promisepromiseOrEmpty.[[Value]]로 둔다.
    3. promiseOrEmpty.[[Value]]empty로 설정한다.
    4. RejectPromise(promise, reason)를 수행한다.
    5. undefined를 반환한다.
  5. rejectCreateBuiltinFunction(rejectSteps, 1, "", « »)로 둔다.
  6. Record { [[Resolve]]: resolve, [[Reject]]: reject }를 반환한다.

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 ( constructor )

The abstract operation NewPromiseCapability takes argument constructor (an ECMAScript language value) and returns either a normal completion containing a PromiseCapability Record or a throw completion. 이는 built-in Promise 생성자의 방식대로 constructor를 생성자로 사용하여 promise를 만들고 그 resolvereject 함수를 추출하려 시도한다. promise와 resolvereject 함수는 새로운 PromiseCapability 레코드를 초기화하는 데 사용된다. It performs the following steps when called:

  1. IsConstructor(constructor)가 false이면, TypeError 예외를 던진다.
  2. NOTE: constructor는 Promise 생성자의 매개변수 관례를 지원하는 생성자 함수라고 가정된다(27.2.3.1 참조).
  3. resolvingFunctionsRecord { [[Resolve]]: undefined, [[Reject]]: undefined }로 둔다.
  4. executorClosureresolvingFunctions를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (resolve, reject)를 가진 새로운 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(constructor, « 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 ( value )

The abstract operation IsPromise takes argument value (an ECMAScript language value) and returns a Boolean. 객체에서 promise brand를 확인한다. It performs the following steps when called:

  1. value가 Object가 아니면, false를 반환한다.
  2. value[[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이다.
  2. reactionspromise.[[PromiseRejectReactions]]로 둔다.
  3. promise.[[PromiseResult]]reason으로 설정한다.
  4. promise.[[PromiseFulfillReactions]]undefined로 설정한다.
  5. promise.[[PromiseRejectReactions]]undefined로 설정한다.
  6. promise.[[PromiseState]]rejected로 설정한다.
  7. promise.[[PromiseIsHandled]]false이면, HostPromiseRejectionTracker(promise, "reject")를 수행한다.
  8. TriggerPromiseReactions(reactions, reason)를 수행한다.
  9. 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 레코드[[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가 handler 없이 rejected될 때, operation 인자가 "reject"로 설정되어 호출된다.
  • rejected promise에 처음으로 handler가 추가될 때, operation 인자가 "handle"로 설정되어 호출된다.

HostPromiseRejectionTracker의 전형적인 구현은 처리되지 않은 rejection을 개발자에게 알리려 할 수 있으며, 동시에 그런 이전 알림이 나중에 새로운 handler의 연결로 무효화되는 경우에도 알리도록 주의할 수 있다.

Note 2

operation"handle"이면, 구현은 garbage collection을 방해하는 방식으로 promise에 대한 참조를 유지해서는 안 된다. operation"reject"이면, rejection은 드물고 hot code path에 있지 않을 것으로 예상되므로 구현은 promise에 대한 참조를 유지할 수 있다.

27.2.2 Promise Job

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). 들어오는 값에 적절한 handler를 적용하고, handler의 반환 값을 사용하여 해당 handler와 관련된 파생 promise를 resolve하거나 reject하는 새로운 Job Abstract Closure를 반환한다. It performs the following steps when called:

  1. jobreactionargument를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Job Abstract Closure로 둔다:
    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 레코드이다.
    8. handlerResultabrupt completion이면,
      1. Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] »)를 반환한다.
    9. 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. NOTE: handler가 undefined가 아닌 한 handlerRealm은 결코 null이 아니다. handler가 revoked 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. jobpromiseToResolve, thenable, 그리고 then을 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Job Abstract Closure로 둔다:
    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. NOTE: thenRealm은 결코 null이 아니다. then.[[Callback]]이 revoked Proxy이고 어떤 코드도 실행되지 않을 때, thenRealm은 오류 객체를 생성하는 데 사용된다.
  6. Record { [[Job]]: job, [[Realm]]: thenRealm }를 반환한다.
Note

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

27.2.3 Promise 생성자

Promise 생성자:

  • %Promise%이다.
  • 전역 객체"Promise" 프로퍼티의 초기 값이다.
  • 생성자로 호출될 때 새로운 Promise를 생성하고 초기화한다.
  • 함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
  • 클래스 정의의 extends 절에서 값으로 사용될 수 있다. 지정된 Promise 동작을 상속하려는 서브클래스 생성자는 PromisePromise.prototype built-in 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 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 코드는 결국 관련 Promise를 resolve하고자 함을 나타내기 위해 resolve 함수를 호출할 수 있다. resolve 함수에 전달된 인자는 지연된 동작의 최종 값을 나타내며, 실제 fulfillment 값이거나 fulfilled되면 그 값을 제공할 다른 promise일 수 있다.

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

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

27.2.4 Promise 생성자의 프로퍼티

Promise 생성자:

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

27.2.4.1 Promise.all ( iterable )

이 함수는 전달된 promise들의 fulfillment 값 배열로 fulfilled되는 새 promise를 반환하거나, rejected되는 첫 번째 전달 promise의 reason으로 rejected된다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve한다.

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

이 함수는 자신의 this value가 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 Object or a throw completion. It performs the following steps when called:

  1. values를 새로운 빈 List로 둔다.
  2. NOTE: remainingElementsCount는 잘못 동작하는 "then"이 입력 iterator가 소진되기 전에 전달된 callback을 호출하는 경우에도 resultCapability.[[Resolve]]가 한 번만 호출되도록 보장하기 위해 0 대신 1에서 시작한다.
  3. remainingElementsCountRecord { [[Value]]: 1 }로 둔다.
  4. index를 0으로 둔다.
  5. 반복한다,
    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. fulfilledStepsvalues, resultCapability, 그리고 remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (value)를 가진 새로운 Abstract Closure로 둔다:
      1. activeFuncactive function object로 둔다.
      2. activeFunc.[[AlreadyCalled]]true이면, undefined를 반환한다.
      3. activeFunc.[[AlreadyCalled]]true로 설정한다.
      4. thisIndexactiveFunc.[[Index]]로 둔다.
      5. values[thisIndex]를 value로 설정한다.
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      7. remainingElementsCount.[[Value]] = 0이면,
        1. valuesArrayCreateArrayFromList(values)로 둔다.
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 반환한다.
      8. undefined를 반환한다.
    6. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둔다.
    7. onFulfilled.[[AlreadyCalled]]false로 설정한다.
    8. onFulfilled.[[Index]]index로 설정한다.
    9. indexindex + 1로 설정한다.
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1로 설정한다.
    11. Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] »)를 수행한다.

27.2.4.2 Promise.allSettled ( iterable )

이 함수는 모든 원래 promise가 settled, 즉 fulfilled 또는 rejected가 된 뒤에야 promise 상태 snapshot의 배열로 fulfilled되는 promise를 반환한다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve한다.

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

이 함수는 자신의 this value가 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 Object or a throw completion. It performs the following steps when called:

  1. values를 새로운 빈 List로 둔다.
  2. NOTE: remainingElementsCount는 잘못 동작하는 "then"이 입력 iterator가 소진되기 전에 전달된 callback 중 하나를 호출하는 경우에도 resultCapability.[[Resolve]]가 한 번만 호출되도록 보장하기 위해 0 대신 1에서 시작한다.
  3. remainingElementsCountRecord { [[Value]]: 1 }로 둔다.
  4. index를 0으로 둔다.
  5. 반복한다,
    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. alreadyCalledRecord { [[Value]]: false }로 둔다.
    6. fulfilledStepsvalues, resultCapability, 그리고 remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (value)를 가진 새로운 Abstract Closure로 둔다:
      1. activeFuncactive function object로 둔다.
      2. activeFunc.[[AlreadyCalled]].[[Value]]true이면, undefined를 반환한다.
      3. activeFunc.[[AlreadyCalled]].[[Value]]true로 설정한다.
      4. objOrdinaryObjectCreate(%Object.prototype%)로 둔다.
      5. CreateDataPropertyOrThrow(obj, "status", "fulfilled")를 수행한다.
      6. CreateDataPropertyOrThrow(obj, "value", value)를 수행한다.
      7. thisIndexactiveFunc.[[Index]]로 둔다.
      8. values[thisIndex]를 obj로 설정한다.
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      10. remainingElementsCount.[[Value]] = 0이면,
        1. valuesArrayCreateArrayFromList(values)로 둔다.
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 반환한다.
      11. undefined를 반환한다.
    7. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둔다.
    8. onFulfilled.[[AlreadyCalled]]alreadyCalled로 설정한다.
    9. onFulfilled.[[Index]]index로 설정한다.
    10. rejectedStepsvalues, resultCapability, 그리고 remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (error)를 가진 새로운 Abstract Closure로 둔다:
      1. activeFuncactive function object로 둔다.
      2. activeFunc.[[AlreadyCalled]].[[Value]]true이면, undefined를 반환한다.
      3. activeFunc.[[AlreadyCalled]].[[Value]]true로 설정한다.
      4. objOrdinaryObjectCreate(%Object.prototype%)로 둔다.
      5. CreateDataPropertyOrThrow(obj, "status", "rejected")를 수행한다.
      6. CreateDataPropertyOrThrow(obj, "reason", error)를 수행한다.
      7. thisIndexactiveFunc.[[Index]]로 둔다.
      8. values[thisIndex]를 obj로 설정한다.
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      10. remainingElementsCount.[[Value]] = 0이면,
        1. valuesArrayCreateArrayFromList(values)로 둔다.
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 반환한다.
      11. undefined를 반환한다.
    11. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둔다.
    12. onRejected.[[AlreadyCalled]]alreadyCalled로 설정한다.
    13. onRejected.[[Index]]index로 설정한다.
    14. indexindex + 1로 설정한다.
    15. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1로 설정한다.
    16. Invoke(nextPromise, "then", « onFulfilled, onRejected »)를 수행한다.

27.2.4.3 Promise.any ( iterable )

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

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

이 함수는 자신의 this value가 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 Object or a throw completion. It performs the following steps when called:

  1. errors를 새로운 빈 List로 둔다.
  2. NOTE: remainingElementsCount는 잘못 동작하는 "then"이 입력 iterator가 소진되기 전에 전달된 callback을 호출하는 경우에도 resultCapability.[[Reject]]가 한 번만 호출되도록 보장하기 위해 0 대신 1에서 시작한다.
  3. remainingElementsCountRecord { [[Value]]: 1 }로 둔다.
  4. index를 0으로 둔다.
  5. 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
    2. nextdone이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      2. remainingElementsCount.[[Value]] = 0이면,
        1. aggregateError를 새로 생성된 AggregateError 객체로 둔다.
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })를 수행한다.
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError »)를 수행한다.
      3. resultCapability.[[Promise]]를 반환한다.
    3. undefinederrors에 추가한다.
    4. nextPromise를 ? Call(promiseResolve, constructor, « next »)로 둔다.
    5. rejectedStepserrors, resultCapability, 그리고 remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (error)를 가진 새로운 Abstract Closure로 둔다:
      1. activeFuncactive function object로 둔다.
      2. activeFunc.[[AlreadyCalled]]true이면, undefined를 반환한다.
      3. activeFunc.[[AlreadyCalled]]true로 설정한다.
      4. thisIndexactiveFunc.[[Index]]로 둔다.
      5. errors[thisIndex]를 error로 설정한다.
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      7. remainingElementsCount.[[Value]] = 0이면,
        1. aggregateError를 새로 생성된 AggregateError 객체로 둔다.
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })를 수행한다.
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError »)를 반환한다.
      8. undefined를 반환한다.
    6. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둔다.
    7. onRejected.[[AlreadyCalled]]false로 설정한다.
    8. onRejected.[[Index]]index로 설정한다.
    9. indexindex + 1로 설정한다.
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1로 설정한다.
    11. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected »)를 수행한다.

27.2.4.4 Promise.prototype

Promise.prototype의 초기 값은 Promise prototype object이다.

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

27.2.4.5 Promise.race ( iterable )

이 함수는 settled되는 첫 번째 전달 promise와 같은 방식으로 settled되는 새 promise를 반환한다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve한다.

  1. constructorthis value로 둔다.
  2. promiseCapability를 ? NewPromiseCapability(constructor)로 둔다.
  3. promiseResolveCompletion(GetPromiseResolve(constructor))로 둔다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecordCompletion(GetIterator(iterable, sync))으로 둔다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. resultCompletion(PerformPromiseRace(iteratorRecord, constructor, 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는 결코 settled되지 않는다.

Note 2

이 함수는 자신의 this value가 Promise 생성자의 매개변수 관례를 지원하는 생성자 함수일 것을 기대한다. 또한 자신의 this value가 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 Object 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 ( reason )

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

  1. constructorthis value로 둔다.
  2. promiseCapability를 ? NewPromiseCapability(constructor)로 둔다.
  3. Call(promiseCapability.[[Reject]], undefined, « reason »)를 수행한다.
  4. promiseCapability.[[Promise]]를 반환한다.
Note

이 함수는 자신의 this value가 Promise 생성자의 매개변수 관례를 지원하는 생성자 함수일 것을 기대한다.

27.2.4.7 Promise.resolve ( resolution )

이 함수는 전달된 인자로 resolved된 새 promise를 반환하거나, 인자가 이 생성자에 의해 생성된 promise이면 인자 자체를 반환한다.

  1. constructorthis value로 둔다.
  2. constructor가 Object가 아니면, TypeError 예외를 던진다.
  3. PromiseResolve(constructor, resolution)을 반환한다.
Note

이 함수는 자신의 this value가 Promise 생성자의 매개변수 관례를 지원하는 생성자 함수일 것을 기대한다.

27.2.4.7.1 PromiseResolve ( constructor, resolution )

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

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

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

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

  1. constructorthis value로 둔다.
  2. constructor가 Object가 아니면, TypeError 예외를 던진다.
  3. promiseCapability를 ? NewPromiseCapability(constructor)로 둔다.
  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 value가 Promise 생성자의 매개변수 관례를 지원하는 생성자 함수일 것을 기대한다.

27.2.4.9 Promise.withResolvers ( )

이 함수는 새 promise와 그와 관련된 resolvereject 함수를 함께 포함하는 세 프로퍼티를 가진 객체를 반환한다.

  1. constructorthis value로 둔다.
  2. promiseCapability를 ? NewPromiseCapability(constructor)로 둔다.
  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 accessor function이 undefinedaccessor property이다. 그 get accessor function은 호출될 때 다음 단계를 수행한다:

  1. this value를 반환한다.

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

Note

Promise prototype 메서드는 일반적으로 파생 객체를 생성하기 위해 자신의 this value의 생성자를 사용한다. 그러나 서브클래스 생성자는 자신의 %Symbol.species% 프로퍼티를 재정의하여 그 기본 동작을 over-ride할 수 있다.

27.2.5 Promise Prototype Object의 프로퍼티

Promise prototype object:

  • %Promise.prototype%이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • ordinary object이다.
  • [[PromiseState]] 내부 슬롯이나 Promise 인스턴스의 다른 내부 슬롯을 가지지 않는다.

27.2.5.1 Promise.prototype.catch ( onRejected )

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

  1. promisethis value로 둔다.
  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 value로 둔다.
  2. promise가 Object가 아니면, TypeError 예외를 던진다.
  3. constructor를 ? SpeciesConstructor(promise, %Promise%)로 둔다.
  4. Assert: IsConstructor(constructor)는 true이다.
  5. IsCallable(onFinally)가 false이면,
    1. thenFinallyonFinally로 둔다.
    2. catchFinallyonFinally로 둔다.
  6. 그렇지 않으면,
    1. thenFinallyClosureonFinallyconstructor를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (value)를 가진 새로운 Abstract Closure로 둔다:
      1. result를 ? Call(onFinally, undefined)로 둔다.
      2. p를 ? PromiseResolve(constructor, result)로 둔다.
      3. returnValuevalue를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure로 둔다:
        1. NormalCompletion(value)를 반환한다.
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « »)로 둔다.
      5. Invoke(p, "then", « valueThunk »)를 반환한다.
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « »)로 둔다.
    3. catchFinallyClosureonFinallyconstructor를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (reason)를 가진 새로운 Abstract Closure로 둔다:
      1. result를 ? Call(onFinally, undefined)로 둔다.
      2. p를 ? PromiseResolve(constructor, result)로 둔다.
      3. throwReasonreason을 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure로 둔다:
        1. 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 value로 둔다.
  2. IsPromise(promise)가 false이면, TypeError 예외를 던진다.
  3. constructor를 ? SpeciesConstructor(promise, %Promise%)로 둔다.
  4. resultCapability를 ? NewPromiseCapability(constructor)로 둔다.
  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 Object or undefined. promise에 대해 onFulfilledonRejected를 settlement action으로 사용하여 “then” 연산을 수행한다. resultCapability가 전달되면, 결과는 resultCapability의 promise를 갱신하여 저장된다. 전달되지 않으면, PerformPromiseThen은 결과가 중요하지 않은 명세 내부 연산에 의해 호출되는 것이다. 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. fulfillReaction을 PromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback }로 둔다.
  8. rejectReaction을 PromiseReaction 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이면, undefined를 반환한다.
  14. resultCapability.[[Promise]]를 반환한다.

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

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

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

27.2.6 Promise 인스턴스의 프로퍼티

Promise 인스턴스는 Promise prototype object(intrinsic, %Promise.prototype%)에서 프로퍼티를 상속하는 ordinary object이다. Promise 인스턴스는 처음에 Table 88에 설명된 내부 슬롯을 가지고 생성된다.

Table 88: Promise 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[PromiseState]] pending, fulfilled, 또는 rejected promise가 자신의 then 메서드에 들어오는 호출에 어떻게 반응할지를 지배한다.
[[PromiseResult]] ECMAScript 언어 값 또는 empty promise가 fulfilled 또는 rejected된 값(있는 경우). [[PromiseState]]pending인 경우에 그리고 오직 그 경우에만 empty이다.
[[PromiseFulfillReactions]] PromiseReaction 레코드List promise가 pending 상태에서 fulfilled 상태로 전환될 때/전환된다면 처리될 레코드.
[[PromiseRejectReactions]] PromiseReaction 레코드List promise가 pending 상태에서 rejected 상태로 전환될 때/전환된다면 처리될 레코드.
[[PromiseIsHandled]] Boolean promise가 fulfillment 또는 rejection handler를 가진 적이 있는지 여부를 나타내며, unhandled rejection 추적에 사용된다.

27.3 GeneratorFunction 객체

GeneratorFunction은 보통 GeneratorDeclaration, GeneratorExpression, 및 GeneratorMethod를 평가하여 생성되는 함수이다. %GeneratorFunction% intrinsic을 호출하여 생성될 수도 있다.

Figure 6 (Informative): Generator 객체 관계
엄청나게 다양한 상자와 화살표.

27.3.1 GeneratorFunction 생성자

GeneratorFunction 생성자:

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

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

마지막 인자(있는 경우)는 generator function의 본문(실행 가능한 코드)을 지정하며, 그 앞의 모든 인자는 형식 매개변수를 지정한다.

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

  1. activeFuncactive function object로 둔다.
  2. bodyArg가 존재하지 않으면, bodyArg를 빈 String으로 설정한다.
  3. CreateDynamicFunction(activeFunc, NewTarget, generator, parameterArgs, bodyArg)을 반환한다.
Note

20.2.1.1NOTE를 참조하라.

27.3.2 GeneratorFunction 생성자의 프로퍼티

GeneratorFunction 생성자:

  • Function 생성자에서 상속하는 표준 built-in function object이다.
  • 값이 %Function%[[Prototype]] 내부 슬롯을 가진다.
  • 값이 1𝔽"length" 프로퍼티를 가진다.
  • 값이 "GeneratorFunction""name" 프로퍼티를 가진다.
  • 다음 프로퍼티를 가진다:

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype의 초기 값은 GeneratorFunction prototype object이다.

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

27.3.3 GeneratorFunction Prototype Object의 프로퍼티

GeneratorFunction prototype object:

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% 프로퍼티의 초기 값은 String 값 "GeneratorFunction"이다.

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

27.3.4 GeneratorFunction 인스턴스

모든 GeneratorFunction 인스턴스는 ECMAScript function object이며 Table 25에 나열된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false이다.

각 GeneratorFunction 인스턴스는 다음 own 프로퍼티를 가진다:

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 인스턴스가 생성될 때마다 또 다른 ordinary object도 생성되며, 이는 generator function의 "prototype" 프로퍼티의 초기 값이 된다. generator function 객체가 [[Call]]을 사용하여 호출될 때 새로 생성된 Generator의 [[Prototype]] 내부 슬롯을 초기화하기 위해 prototype 프로퍼티의 값이 사용된다.

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

Note

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

27.4 AsyncGeneratorFunction 객체

AsyncGeneratorFunction은 보통 AsyncGeneratorDeclaration, AsyncGeneratorExpression, 및 AsyncGeneratorMethod 구문 생성을 평가하여 생성되는 함수이다. %AsyncGeneratorFunction% intrinsic을 호출하여 생성될 수도 있다.

27.4.1 AsyncGeneratorFunction 생성자

AsyncGeneratorFunction 생성자:

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

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

마지막 인자(있는 경우)는 async generator function의 본문(실행 가능한 코드)을 지정하며, 그 앞의 모든 인자는 형식 매개변수를 지정한다.

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

  1. activeFuncactive function object로 둔다.
  2. bodyArg가 존재하지 않으면, bodyArg를 빈 String으로 설정한다.
  3. CreateDynamicFunction(activeFunc, NewTarget, async-generator, parameterArgs, bodyArg)을 반환한다.
Note

20.2.1.1NOTE를 참조하라.

27.4.2 AsyncGeneratorFunction 생성자의 프로퍼티

AsyncGeneratorFunction 생성자:

  • Function 생성자에서 상속하는 표준 built-in function object이다.
  • 값이 %Function%[[Prototype]] 내부 슬롯을 가진다.
  • 값이 1𝔽"length" 프로퍼티를 가진다.
  • 값이 "AsyncGeneratorFunction""name" 프로퍼티를 가진다.
  • 다음 프로퍼티를 가진다:

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype의 초기 값은 AsyncGeneratorFunction prototype object이다.

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

27.4.3 AsyncGeneratorFunction Prototype Object의 프로퍼티

AsyncGeneratorFunction prototype object:

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% 프로퍼티의 초기 값은 String 값 "AsyncGeneratorFunction"이다.

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

27.4.4 AsyncGeneratorFunction 인스턴스

모든 AsyncGeneratorFunction 인스턴스는 ECMAScript function object이며 Table 25에 나열된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false이다.

각 AsyncGeneratorFunction 인스턴스는 다음 own 프로퍼티를 가진다:

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 인스턴스가 생성될 때마다 또 다른 ordinary object도 생성되며, 이는 async generator function의 "prototype" 프로퍼티의 초기 값이 된다. generator function 객체가 [[Call]]을 사용하여 호출될 때 새로 생성된 AsyncGenerator의 [[Prototype]] 내부 슬롯을 초기화하기 위해 prototype 프로퍼티의 값이 사용된다.

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

Note

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

27.5 Generator 객체

Generator는 generator function을 호출하여 생성되며 iterator 인터페이스iterable 인터페이스를 모두 준수한다.

Generator 인스턴스는 그 인스턴스를 생성한 generator function의 "prototype" 프로퍼티의 초기 값에서 직접 프로퍼티를 상속한다. Generator 인스턴스는 %GeneratorPrototype%에서 간접적으로 프로퍼티를 상속한다.

27.5.1 %GeneratorPrototype% 객체

%GeneratorPrototype% 객체:

  • %GeneratorFunction.prototype.prototype%이다.
  • ordinary object이다.
  • Generator 인스턴스가 아니며 [[GeneratorState]] 내부 슬롯을 가지지 않는다.
  • 값이 %Iterator.prototype%[[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. generatorthis value로 둔다.
  2. completionReturnCompletion(value)로 둔다.
  3. GeneratorResumeAbrupt(generator, completion, empty)를 반환한다.

27.5.1.4 %GeneratorPrototype%.throw ( exception )

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

  1. generatorthis value로 둔다.
  2. completionThrowCompletion(exception)으로 둔다.
  3. GeneratorResumeAbrupt(generator, completion, empty)를 반환한다.

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

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

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

27.5.2 Generator 인스턴스의 프로퍼티

Generator 인스턴스는 처음에 Table 89에 설명된 내부 슬롯을 가지고 생성된다.

Table 89: Generator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[GeneratorState]] suspended-start, suspended-yield, executing, 또는 completed generator의 현재 실행 상태.
[[GeneratorContext]] execution context 이 generator의 코드를 실행할 때 사용되는 execution context.
[[GeneratorBrand]] String 또는 empty 서로 다른 종류의 generator를 구별하는 데 사용되는 brand. ECMAScript 소스 텍스트로 선언된 generator의 [[GeneratorBrand]]는 항상 empty이다.

27.5.3 Generator 추상 연산

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. genContextrunning execution context로 둔다.
  3. genContext의 Generator component를 generator로 설정한다.
  4. closuregeneratorBody를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure로 둔다:
    1. acGenContextrunning execution context로 둔다.
    2. acGeneratoracGenContext의 Generator component로 둔다.
    3. generatorBody가 Parse Node이면,
      1. resultCompletion(generatorBodyEvaluation)으로 둔다.
    4. 그렇지 않으면,
      1. Assert: generatorBody는 매개변수가 없는 Abstract Closure이다.
      2. resultCompletion(generatorBody())로 둔다.
    5. Assert: 여기로 반환된다면, generator는 예외를 던졌거나 암시적 또는 명시적 return을 수행한 것이다.
    6. execution context stack에서 acGenContext를 제거하고 execution context stack의 맨 위에 있는 execution contextrunning execution context로 복원한다.
    7. acGenerator.[[GeneratorState]]completed로 설정한다.
    8. NOTE: generator가 completed 상태에 들어가면 그 상태를 결코 떠나지 않으며 관련 execution context는 다시 재개되지 않는다. acGenerator와 관련된 모든 실행 상태는 이 시점에서 폐기될 수 있다.
    9. resultnormal completion이면,
      1. resultValueundefined로 둔다.
    10. 그렇지 않고 resultreturn completion이면,
      1. resultValueresult.[[Value]]로 둔다.
    11. 그렇지 않으면,
      1. Assert: resultthrow completion이다.
      2. result를 반환한다.
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true))를 반환한다.
  5. execution context에 대해 평가가 재개될 때 closure가 인자 없이 호출되도록 genContext의 code evaluation state를 설정한다.
  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. generator.[[GeneratorState]]executing으로 설정한다.
  6. RunSuspendedContext(genContext, NormalCompletion(value))를 반환한다.

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. NOTE: 생성기가 completed 상태에 들어가면 다시는 그 상태를 벗어나지 않으며, 관련 실행 컨텍스트도 다시 재개되지 않는다. 이 시점에서 generator와 관련된 모든 실행 상태는 폐기될 수 있다.
    3. statecompleted로 설정한다.
  3. statecompleted이면, 다음을 수행한다.
    1. abruptCompletion이 return 완료이면, 다음을 수행한다.
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true)를 반환한다.
    2. abruptCompletion을 반환한다.
  4. Assert: statesuspended-yield이다.
  5. genContextgenerator.[[GeneratorContext]]라 하자.
  6. generator.[[GeneratorState]]executing으로 설정한다.
  7. RunSuspendedContext(genContext, abruptCompletion)을 반환한다.

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. genContextrunning execution context로 둔다.
  2. genContext가 Generator component를 가지지 않으면, non-generator를 반환한다.
  3. generatorgenContext의 Generator component로 둔다.
  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. genContextrunning execution context로 둔다.
  2. Assert: genContext는 generator의 execution context이다.
  3. generatorgenContext의 Generator component 값으로 둔다.
  4. Assert: GetGeneratorKind()는 sync이다.
  5. generator.[[GeneratorState]]suspended-yield로 설정한다.
  6. execution context stack에서 genContext를 제거하고 execution context stack의 맨 위에 있는 execution contextrunning execution context로 복원한다.
  7. callerContextrunning execution context로 둔다.
  8. NormalCompletion(iteratorResult)를 전달하여 callerContext를 재개한다. genContext가 다시 재개되면, resumptionValue를 그것이 재개될 때의 Completion Record로 둔다.
  9. Assert: 제어가 여기 도달하면, genContext가 다시 running execution context이다.
  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. NOTE: closure는 IteratorResult 객체를 산출하기 위해 Yield 연산의 사용을 포함할 수 있다.
  2. extraSlots가 존재하지 않으면, extraSlots를 새로운 빈 List로 설정한다.
  3. internalSlotsListextraSlots와 « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »의 list-concatenation으로 둔다.
  4. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList)로 둔다.
  5. generator.[[GeneratorBrand]]generatorBrand로 설정한다.
  6. generator.[[GeneratorState]]suspended-start로 설정한다.
  7. callerContextrunning execution context로 둔다.
  8. calleeContext를 새로운 execution context로 둔다.
  9. calleeContext의 Function을 null로 설정한다.
  10. calleeContextRealm을 현재 Realm Record로 설정한다.
  11. calleeContext의 ScriptOrModule을 callerContext의 ScriptOrModule로 설정한다.
  12. callerContext가 아직 suspended가 아니면, callerContext를 suspend한다.
  13. calleeContextexecution context stack에 push한다; calleeContext는 이제 running execution context이다.
  14. GeneratorStart(generator, closure)를 수행한다.
  15. execution context stack에서 calleeContext를 제거하고 callerContextrunning execution context로 복원한다.
  16. generator를 반환한다.

27.6 AsyncGenerator 객체

AsyncGenerator는 async generator function을 호출하여 생성되며 async iterator 인터페이스async iterable 인터페이스를 모두 준수한다.

AsyncGenerator 인스턴스는 그 인스턴스를 생성한 async generator function의 "prototype" 프로퍼티의 초기 값에서 직접 프로퍼티를 상속한다. AsyncGenerator 인스턴스는 %AsyncGeneratorPrototype%에서 간접적으로 프로퍼티를 상속한다.

27.6.1 %AsyncGeneratorPrototype% 객체

%AsyncGeneratorPrototype% 객체:

  • %AsyncGeneratorFunction.prototype.prototype%이다.
  • ordinary object이다.
  • AsyncGenerator 인스턴스가 아니며 [[AsyncGeneratorState]] 내부 슬롯을 가지지 않는다.
  • 값이 %AsyncIteratorPrototype%[[Prototype]] 내부 슬롯을 가진다.
  • 모든 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 value로 둔다.
  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 value로 둔다.
  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. 그렇지 않고 statesuspended-yield이면,
    1. AsyncGeneratorResume(generator, completion)를 수행한다.
  10. 그렇지 않으면,
    1. Assert: stateexecuting 또는 draining-queue이다.
  11. promiseCapability.[[Promise]]를 반환한다.

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis value로 둔다.
  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% 프로퍼티의 초기 값은 String 값 "AsyncGenerator"이다.

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

27.6.2 AsyncGenerator 인스턴스의 프로퍼티

AsyncGenerator 인스턴스는 처음에 아래에 설명된 내부 슬롯을 가지고 생성된다:

Table 90: AsyncGenerator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, 또는 completed async generator의 현재 실행 상태.
[[AsyncGeneratorContext]] execution context 이 async generator의 코드를 실행할 때 사용되는 execution context.
[[AsyncGeneratorQueue]] AsyncGeneratorRequest 레코드의 List async generator를 재개하기 위한 요청을 나타내는 레코드. 상태 전환 중을 제외하면, [[AsyncGeneratorState]]executing 또는 draining-queue인 경우에 그리고 오직 그 경우에만 비어 있지 않다.
[[GeneratorBrand]] String 또는 empty 서로 다른 종류의 async generator를 구별하는 데 사용되는 brand. ECMAScript 소스 텍스트로 선언된 async generator의 [[GeneratorBrand]]는 항상 empty이다.

27.6.3 AsyncGenerator 추상 연산

27.6.3.1 AsyncGeneratorRequest 레코드

AsyncGeneratorRequest는 async generator가 어떻게 재개되어야 하는지에 대한 정보를 저장하고 해당 promise를 fulfill하거나 reject하기 위한 capability를 포함하는 데 사용되는 Record 값이다.

다음 필드를 가진다:

Table 91: AsyncGeneratorRequest 레코드 필드
필드 이름 의미
[[Completion]] Completion Record async generator를 재개하는 데 사용되어야 하는 Completion Record.
[[Capability]] PromiseCapability 레코드 이 요청과 관련된 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. genContextrunning execution context로 둔다.
  3. genContext의 Generator component를 generator로 설정한다.
  4. closuregeneratorBody를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure로 둔다:
    1. acGenContextrunning execution context로 둔다.
    2. acGeneratoracGenContext의 Generator component로 둔다.
    3. generatorBody가 Parse Node이면,
      1. resultCompletion(generatorBodyEvaluation)으로 둔다.
    4. 그렇지 않으면,
      1. Assert: generatorBody는 매개변수가 없는 Abstract Closure이다.
      2. resultCompletion(generatorBody())로 둔다.
    5. Assert: 여기로 반환된다면, async generator는 예외를 던졌거나 암시적 또는 명시적 return을 수행한 것이다.
    6. execution context stack에서 acGenContext를 제거하고 execution context stack의 맨 위에 있는 execution contextrunning execution context로 복원한다.
    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. execution context에 대해 평가가 재개될 때 closure가 인자 없이 호출되도록 genContext의 code evaluation state를 설정한다.
  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. oldRealmrunning execution contextRealm으로 둔다.
      2. running execution contextRealmrealm으로 설정한다.
      3. iteratorResultCreateIteratorResultObject(value, done)로 둔다.
      4. running execution contextRealmoldRealm으로 설정한다.
    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. generator.[[AsyncGeneratorState]]executing으로 설정한다.
  4. RunSuspendedContext(genContext, completion)을 수행한다.
  5. 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. genContextrunning execution context로 둔다.
  2. Assert: genContext는 generator의 execution context이다.
  3. generatorgenContext의 Generator component 값으로 둔다.
  4. Assert: GetGeneratorKind()는 async이다.
  5. completionNormalCompletion(value)로 둔다.
  6. Assert: execution context stack은 최소 두 개의 요소를 가진다.
  7. previousContextexecution context stack에서 위에서 두 번째 요소로 둔다.
  8. previousRealmpreviousContextRealm으로 둔다.
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm)을 수행한다.
  10. queuegenerator.[[AsyncGeneratorQueue]]로 둔다.
  11. queue가 비어 있지 않으면,
    1. NOTE: 실행은 generator를 suspend하지 않고 계속된다.
    2. toYieldqueue의 첫 번째 요소로 둔다.
    3. resumptionValueCompletion(toYield.[[Completion]])으로 둔다.
    4. AsyncGeneratorUnwrapYieldResumption(resumptionValue)를 반환한다.
  12. generator.[[AsyncGeneratorState]]suspended-yield로 설정한다.
  13. execution context stack에서 genContext를 제거하고 execution context stack의 맨 위에 있는 execution contextrunning execution context로 복원한다.
  14. callerContextrunning execution context로 둔다.
  15. undefined를 전달하여 callerContext를 재개한다. genContext가 다시 재개되면, resumptionValue를 그것이 재개될 때의 Completion Record로 둔다.
  16. Assert: 제어가 여기 도달하면, genContext가 다시 running execution context이다.
  17. 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. fulfilledClosuregenerator를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (value)를 가진 새로운 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. rejectedClosuregenerator를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수 (reason)를 가진 새로운 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를 만날 때까지 generator의 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. completionnormal completion이면,
      1. completionNormalCompletion(undefined)로 설정한다.
    5. AsyncGeneratorCompleteStep(generator, completion, true)를 수행한다.
  4. generator.[[AsyncGeneratorState]]completed로 설정한다.
  5. unused를 반환한다.

27.7 AsyncFunction 객체

AsyncFunction은 보통 AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncMethod, 및 AsyncArrowFunction을 평가하여 생성되는 함수이다. %AsyncFunction% intrinsic을 호출하여 생성될 수도 있다.

27.7.1 AsyncFunction 생성자

AsyncFunction 생성자:

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

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

마지막 인자(있는 경우)는 async function의 본문(실행 가능한 코드)을 지정한다. 그 앞의 모든 인자는 형식 매개변수를 지정한다.

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

  1. activeFuncactive function object로 둔다.
  2. bodyArg가 존재하지 않으면, bodyArg를 빈 String으로 설정한다.
  3. CreateDynamicFunction(activeFunc, NewTarget, async, parameterArgs, bodyArg)을 반환한다.
Note
20.2.1.1NOTE를 참조하라.

27.7.2 AsyncFunction 생성자의 프로퍼티

AsyncFunction 생성자:

  • Function 생성자에서 상속하는 표준 built-in function object이다.
  • 값이 %Function%[[Prototype]] 내부 슬롯을 가진다.
  • 값이 1𝔽"length" 프로퍼티를 가진다.
  • 값이 "AsyncFunction""name" 프로퍼티를 가진다.
  • 다음 프로퍼티를 가진다:

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype의 초기 값은 AsyncFunction prototype object이다.

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

27.7.3 AsyncFunction Prototype Object의 프로퍼티

AsyncFunction prototype object:

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% 프로퍼티의 초기 값은 String 값 "AsyncFunction"이다.

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

27.7.4 AsyncFunction 인스턴스

모든 AsyncFunction 인스턴스는 ECMAScript function object이며 Table 25에 나열된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false이다. AsyncFunction 인스턴스는 생성자가 아니며 [[Construct]] 내부 메서드를 가지지 않는다. AsyncFunction 인스턴스는 constructable이 아니므로 prototype 프로퍼티를 가지지 않는다.

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

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 Function 추상 연산

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. runningContextrunning execution context로 둔다.
  2. asyncContextrunningContext의 복사본으로 둔다.
  3. NOTE: AsyncBlockStart가 자신의 실행을 재개하려면 실행 상태 복사가 필요하다. 현재 실행 중인 context를 재개하는 것은 잘 정의되어 있지 않다.
  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. promiseCapabilityasyncBody를 캡처하고, 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closureclosure라 하자.
    1. acAsyncContext를 실행 중인 실행 컨텍스트라 하자.
    2. asyncBody가 Parse Node이면, 다음을 수행한다.
      1. resultCompletion(asyncBodyEvaluation)이라 하자.
    3. 그렇지 않으면,
      1. Assert: asyncBody는 매개변수가 없는 Abstract Closure이다.
      2. resultCompletion(asyncBody())라 하자.
    4. Assert: 여기로 반환되었다면, async 함수는 예외를 던졌거나 암시적 또는 명시적 반환을 수행한 것이다. 모든 await는 완료되었다.
    5. acAsyncContext를 실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 맨 위에 있는 실행 컨텍스트를 실행 중인 실행 컨텍스트로 복원한다.
    6. result가 정상 완료이면, 다음을 수행한다.
      1. Call(promiseCapability.[[Resolve]], undefined, « undefined »)을 수행한다.
    7. 그렇지 않고 result가 return 완료이면, 다음을 수행한다.
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] »)을 수행한다.
    8. 그렇지 않으면,
      1. Assert: result는 throw 완료이다.
      2. Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »)을 수행한다.
    9. NormalCompletion(unused)을 반환한다.
  2. asyncContext의 코드 평가 상태를 설정하여, 해당 실행 컨텍스트에 대해 평가가 재개될 때 closure가 인수 없이 호출되도록 한다.
  3. result를 ! RunSuspendedContext(asyncContext, NormalCompletion(empty))라 하자.
  4. Assert: resultunused이다.
  5. NOTE: result 값의 가능한 출처는 Await 또는, async 함수가 아무것도 await하지 않는 경우, 위의 단계 1.i이다.
  6. 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. asyncContext를 캡처하고, 호출될 때 다음 단계를 수행하는, 매개변수 (v)를 갖는 새로운 Abstract ClosurefulfilledClosure라 하자.
    1. Completion(RunSuspendedContext(asyncContext, NormalCompletion(v)))를 수행한다.
    2. NOTE: RunSuspendedContext가 반환한 Completion Record는 의도적으로 무시된다.
    3. NormalCompletion(undefined)을 반환한다.
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « »)라 하자.
  5. asyncContext를 캡처하고, 호출될 때 다음 단계를 수행하는, 매개변수 (reason)를 갖는 새로운 Abstract ClosurerejectedClosure라 하자.
    1. Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason)))을 수행한다.
    2. NOTE: RunSuspendedContext가 반환한 Completion Record는 의도적으로 무시된다.
    3. NormalCompletion(undefined)을 반환한다.
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)라 하자.
  7. PerformPromiseThen(promise, onFulfilled, onRejected)를 수행한다.
  8. asyncContext를 실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 맨 위에 있는 실행 컨텍스트를 실행 중인 실행 컨텍스트로 복원한다.
  9. callerContext를 실행 중인 실행 컨텍스트라 하자.
  10. empty를 전달하여 callerContext를 재개한다. asyncContext가 다시 재개되는 경우, 그것을 재개하는 데 사용된 Completion Recordcompletion이라 하자.
  11. Assert: 제어가 여기에 도달하면, asyncContext가 다시 실행 중인 실행 컨텍스트이다.
  12. completion을 반환한다.