페이지 표시 설정

27 제어 추상화 객체

27.1 순회

27.1.1 공통 순회 인터페이스

인터페이스는 연결된 값이 특정 명세와 일치하는 프로퍼티 키의 집합입니다. 인터페이스의 명세에 설명된 모든 프로퍼티를 제공하는 객체는 해당 인터페이스를 준수합니다. 인터페이스는 별도의 객체로 표현되지 않습니다. 어떤 인터페이스든 이를 준수하는 여러 개별 구현 객체가 있을 수 있습니다. 하나의 객체가 여러 인터페이스를 준수할 수도 있습니다.

27.1.1.1 Iterable 인터페이스

iterable 인터페이스에는 표 79에 설명된 프로퍼티가 포함됩니다:

표 79: Iterable 인터페이스 필수 프로퍼티
프로퍼티 값 요구 사항
%Symbol.iterator% a function that returns an iterator object 반환된 객체는 iterator 인터페이스를 준수해야 합니다.

27.1.1.2 Iterator 인터페이스

iterator 인터페이스를 구현하는 객체는 표 80의 프로퍼티를 포함해야 합니다. 이러한 객체는 표 81의 프로퍼티도 구현할 수 있습니다.

표 80: Iterator 인터페이스 필수 프로퍼티
프로퍼티 값 요구 사항
"next" a function that returns an IteratorResult object 반환된 객체는 IteratorResult 인터페이스를 준수해야 합니다. iterator의 next 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체를 반환했다면, 해당 객체의 next 메서드에 대한 이후의 모든 호출도 "done" 프로퍼티가 true인 IteratorResult 객체를 반환해야 합니다. 그러나 이 요구 사항은 강제되지 않습니다.
참고 1

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

표 81: Iterator 인터페이스 선택적 프로퍼티
프로퍼티 값 요구 사항
"return" a function that returns an IteratorResult object 반환된 객체는 IteratorResult 인터페이스를 준수해야 합니다. 이 메서드를 호출하면 호출자가 해당 iterator에 대해 더 이상 next 메서드를 호출하지 않을 것임을 iterator 객체에 알립니다. 반환되는 IteratorResult 객체는 일반적으로 값이 true인 "done" 프로퍼티와 return 메서드의 인수로 전달된 값을 갖는 "value" 프로퍼티를 갖습니다. 그러나 이 요구 사항은 강제되지 않습니다.
"throw" a function that returns an IteratorResult object 반환된 객체는 IteratorResult 인터페이스를 준수해야 합니다. 이 메서드를 호출하면 호출자가 오류 조건을 감지했음을 iterator 객체에 알립니다. 인수는 오류 조건을 식별하는 데 사용할 수 있으며 일반적으로 예외 객체입니다. 일반적인 응답은 인수로 전달된 값을 throw하는 것입니다. 메서드가 throw하지 않으면 반환된 IteratorResult 객체는 일반적으로 값이 true인 "done" 프로퍼티를 갖습니다.
참고 2

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

27.1.1.3 Async Iterable 인터페이스

async iterable 인터페이스에는 표 82에 설명된 프로퍼티가 포함됩니다:

표 82: Async Iterable 인터페이스 필수 프로퍼티
프로퍼티 값 요구 사항
%Symbol.asyncIterator% a function that returns an async iterator object 반환된 객체는 async iterator 인터페이스를 준수해야 합니다.

27.1.1.4 Async Iterator 인터페이스

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

표 83: Async Iterator 인터페이스 필수 프로퍼티
프로퍼티 값 요구 사항
"next" a function that returns a promise for an IteratorResult object

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

또한 이행 값으로 사용되는 IteratorResult 객체에는 값이 promise(또는 “thenable”)가 아닌 "value" 프로퍼티가 있어야 합니다. 그러나 이 요구 사항 역시 강제되지 않습니다.

참고 1

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

표 84: Async Iterator 인터페이스 선택적 프로퍼티
프로퍼티 값 요구 사항
"return" a function that returns a promise for an IteratorResult object

반환된 promise가 이행되면 IteratorResult 인터페이스를 준수하는 객체로 이행되어야 합니다. 이 메서드를 호출하면 호출자가 해당 async iterator에 대해 더 이상 next 메서드를 호출하지 않을 것임을 async iterator 객체에 알립니다. 반환된 promise는 일반적으로 값이 true인 "done" 프로퍼티와 return 메서드의 인수로 전달된 값을 갖는 "value" 프로퍼티가 있는 IteratorResult 객체로 이행됩니다. 그러나 이 요구 사항은 강제되지 않습니다.

또한 이행 값으로 사용되는 IteratorResult 객체에는 값이 promise(또는 “thenable”)가 아닌 "value" 프로퍼티가 있어야 합니다. 인수 값이 일반적인 방식으로 사용되는 경우, 거부된 promise라면 같은 이유로 거부되는 promise가 반환되어야 하며, 이행된 promise라면 그 이행 값을 반환 promise의 IteratorResult 객체 이행 값의 "value" 프로퍼티로 사용해야 합니다. 그러나 이러한 요구 사항 역시 강제되지 않습니다.

"throw" a function that returns a promise for an IteratorResult object

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

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

참고 2

일반적으로 이러한 메서드의 호출자는 메서드를 호출하기 전에 존재 여부를 확인해야 합니다. for-await-of 및 yield*를 포함한 특정 ECMAScript 언어 기능은 존재 여부를 확인한 후 이러한 메서드를 호출합니다.

27.1.1.5 IteratorResult 인터페이스

IteratorResult 인터페이스에는 표 85에 나열된 프로퍼티가 포함됩니다:

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

27.1.2 Iterator Helper 객체

Iterator Helper 객체는 특정 소스 iterator 객체의 지연 변환을 나타내는 일반 객체입니다. Iterator Helper 객체에는 이름 있는 생성자가 없습니다. 대신 Iterator Helper 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

27.1.2.1 %IteratorHelperPrototype% 객체

%IteratorHelperPrototype% 객체는:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. ? GeneratorResume(this 값, undefined, "Iterator Helper")를 반환합니다.

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[UnderlyingIterators]])를 수행합니다.
  3. 단언: obj에는 [[GeneratorState]] 내부 슬롯이 있습니다.
  4. obj.[[GeneratorState]]가 suspended-start이면, 다음을 수행합니다.
    1. obj.[[GeneratorState]]를 completed로 설정합니다.
    2. 참고: generator가 completed 상태에 들어가면 다시 벗어나지 않으며 연결된 실행 컨텍스트는 다시 재개되지 않습니다. obj와 연결된 모든 실행 상태는 이 시점에 폐기할 수 있습니다.
    3. ? IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused))을 수행합니다.
    4. CreateIteratorResultObject(undefined, true)를 반환합니다.
  5. completion을 ReturnCompletion(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. method가 undefined이면 TypeError 예외를 던집니다.
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item }를 iterables에 추가합니다.
  3. closure를 매개변수가 없고 iterables를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. iterables의 각 Record iterable에 대해 다음을 수행합니다.
      1. iterator를 ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]])로 둡니다.
      2. iterator가 Object가 아니면 TypeError 예외를 던집니다.
      3. iteratorRecord를 ? GetIteratorDirect(iterator)로 둡니다.
      4. innerAlive를 true로 둡니다.
      5. innerAlive가 true인 동안 다음을 반복합니다.
        1. innerValue를 ? IteratorStepValue(iteratorRecord)로 둡니다.
        2. innerValue가 done이면, 다음을 수행합니다.
          1. innerAlive를 false로 설정합니다.
        3. 그렇지 않으면,
          1. completion을 Completion(Yield(innerValue))으로 둡니다.
          2. completion이 abrupt completion이면, 다음을 수행합니다.
            1. ? IteratorClose(iteratorRecord, completion)을 반환합니다.
    2. ReturnCompletion(undefined)을 반환합니다.
  4. gen을 CreateIteratorFromClosure(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. hasInstance가 true이면, 다음을 수행합니다.
    1. iteratorRecord.[[Iterator]]를 반환합니다.
  4. wrapper를 OrdinaryObjectCreate(%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. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[Iterated]])를 수행합니다.
  3. iteratorRecord를 obj.[[Iterated]]로 둡니다.
  4. ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])를 반환합니다.

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[Iterated]])를 수행합니다.
  3. iterator를 obj.[[Iterated]].[[Iterator]]로 둡니다.
  4. 단언: iterator는 Object입니다.
  5. returnMethod를 ? GetMethod(iterator, "return")으로 둡니다.
  6. returnMethod가 undefined이면, 다음을 수행합니다.
    1. CreateIteratorResultObject(undefined, true)를 반환합니다.
  7. ? Call(returnMethod, iterator)를 반환합니다.

27.1.3.2.3 Iterator.prototype

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.1.3.2.4 Iterator.zip ( iterables [ , options ] )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. iterables가 Object가 아니면 TypeError 예외를 던집니다.
  2. options를 ? GetOptionsObject(options)로 설정합니다.
  3. mode를 ? Get(options, "mode")로 둡니다.
  4. mode가 undefined이면 mode를 "shortest"로 설정합니다.
  5. mode가 "shortest", "longest", "strict" 중 하나가 아니면 TypeError 예외를 던집니다.
  6. paddingOption을 undefined로 둡니다.
  7. mode가 "longest"이면, 다음을 수행합니다.
    1. paddingOption을 ? Get(options, "padding")으로 설정합니다.
    2. paddingOption이 undefined가 아니고 Object도 아니면 TypeError 예외를 던집니다.
  8. iters를 새로운 빈 List로 둡니다.
  9. padding을 새로운 빈 List로 둡니다.
  10. inputIter를 ? GetIterator(iterables, sync)로 둡니다.
  11. next를 not-started로 둡니다.
  12. next가 done이 아닌 동안 다음을 반복합니다.
    1. next를 Completion(IteratorStepValue(inputIter))으로 설정합니다.
    2. IfAbruptCloseIterators(next, iters).
    3. next가 done이 아니면, 다음을 수행합니다.
      1. iter를 Completion(GetIteratorFlattenable(next, reject-primitives))으로 둡니다.
      2. needClosing을 « inputIter »와 iters의 목록 연결로 둡니다.
      3. IfAbruptCloseIterators(iter, needClosing).
      4. iter를 iters에 추가합니다.
  13. iterCount를 iters의 요소 수로 둡니다.
  14. mode가 "longest"이면, 다음을 수행합니다.
    1. paddingOption이 undefined이면, 다음을 수행합니다.
      1. iterCount번 반복합니다:
        1. undefined를 padding에 추가합니다.
    2. 그렇지 않으면,
      1. paddingIter를 Completion(GetIterator(paddingOption, sync))으로 둡니다.
      2. IfAbruptCloseIterators(paddingIter, iters).
      3. usingIterator를 true로 둡니다.
      4. iterCount번 반복합니다:
        1. usingIterator가 true이면, 다음을 수행합니다.
          1. next를 Completion(IteratorStepValue(paddingIter))으로 설정합니다.
          2. IfAbruptCloseIterators(next, iters).
          3. next가 done이면, 다음을 수행합니다.
            1. usingIterator를 false로 설정합니다.
          4. 그렇지 않으면,
            1. next를 padding에 추가합니다.
        2. usingIterator가 false이면 undefined를 padding에 추가합니다.
      5. usingIterator가 true이면, 다음을 수행합니다.
        1. completion을 Completion(IteratorClose(paddingIter, NormalCompletion(unused)))으로 둡니다.
        2. IfAbruptCloseIterators(completion, iters).
  15. finishResults를 매개변수 (results)를 가지며 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. CreateArrayFromList(results)를 반환합니다.
  16. IteratorZip(iters, mode, padding, finishResults)를 반환합니다.

27.1.3.2.5 Iterator.zipKeyed ( iterables [ , options ] )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. iterables가 Object가 아니면 TypeError 예외를 던집니다.
  2. options를 ? GetOptionsObject(options)로 설정합니다.
  3. mode를 ? Get(options, "mode")로 둡니다.
  4. mode가 undefined이면 mode를 "shortest"로 설정합니다.
  5. mode가 "shortest", "longest", "strict" 중 하나가 아니면 TypeError 예외를 던집니다.
  6. paddingOption을 undefined로 둡니다.
  7. mode가 "longest"이면, 다음을 수행합니다.
    1. paddingOption을 ? Get(options, "padding")으로 설정합니다.
    2. paddingOption이 undefined가 아니고 Object도 아니면 TypeError 예외를 던집니다.
  8. iters를 새로운 빈 List로 둡니다.
  9. padding을 새로운 빈 List로 둡니다.
  10. allKeys를 ? iterables.[[OwnPropertyKeys]]()로 둡니다.
  11. keys를 새로운 빈 List로 둡니다.
  12. allKeys의 각 요소 key에 대해 다음을 수행합니다.
    1. propertyDesc를 Completion(iterables.[[GetOwnProperty]](key))으로 둡니다.
    2. IfAbruptCloseIterators(propertyDesc, iters).
    3. propertyDesc가 undefined가 아니고 propertyDesc.[[Enumerable]]이 true이면, 다음을 수행합니다.
      1. value를 Completion(Get(iterables, key))으로 둡니다.
      2. IfAbruptCloseIterators(value, iters).
      3. value가 undefined가 아니면, 다음을 수행합니다.
        1. key를 keys에 추가합니다.
        2. iter를 Completion(GetIteratorFlattenable(value, reject-primitives))으로 둡니다.
        3. IfAbruptCloseIterators(iter, iters).
        4. iter를 iters에 추가합니다.
  13. iterCount를 iters의 요소 수로 둡니다.
  14. mode가 "longest"이면, 다음을 수행합니다.
    1. paddingOption이 undefined이면, 다음을 수행합니다.
      1. iterCount번 반복합니다:
        1. undefined를 padding에 추가합니다.
    2. 그렇지 않으면,
      1. keys의 각 요소 key에 대해 다음을 수행합니다.
        1. value를 Completion(Get(paddingOption, key))으로 둡니다.
        2. IfAbruptCloseIterators(value, iters).
        3. value를 padding에 추가합니다.
  15. finishResults를 매개변수 (results)를 가지며 keys와 iterCount를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. obj를 OrdinaryObjectCreate(null)로 둡니다.
    2. 0 ≤ i < iterCount를 만족하는 각 정수 i에 대해 오름차순으로 다음을 수행합니다.
      1. ! CreateDataPropertyOrThrow(obj, keys[i], results[i])를 수행합니다.
    3. obj를 반환합니다.
  16. IteratorZip(iters, mode, padding, finishResults)를 반환합니다.

27.1.3.3 Iterator 프로토타입 객체의 프로퍼티

Iterator 프로토타입 객체는:

참고

이 명세에서 정의되고 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.chunks ( chunkSize )

이 메서드는 호출될 때 다음 단계를 수행합니다.

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator 레코드 { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. chunkSize가 정수인 Number가 아니면 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. chunkSize가 1𝔽부터 𝔽(232 - 1)까지 양 끝을 포함하는 구간에 있지 않으면 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  6. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  7. closure를 iterated와 chunkSize를 캡처하고 매개변수가 없으며 호출될 때 다음 단계를 수행하는 새로운 추상 클로저로 둡니다.
    1. buffer를 새로운 빈 List로 둡니다.
    2. 다음 단계를 반복합니다.
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. value가 done이면 다음을 수행합니다.
        1. buffer가 비어 있지 않으면 다음을 수행합니다.
          1. Completion(Yield(CreateArrayFromList(buffer)))을 수행합니다.
        2. ReturnCompletion(undefined)를 반환합니다.
      3. value를 buffer에 추가합니다.
      4. buffer의 요소 수가 ℝ(chunkSize)이면 다음을 수행합니다.
        1. completion을 Completion(Yield(CreateArrayFromList(buffer)))으로 둡니다.
        2. IfAbruptCloseIterator(completion, iterated)를 수행합니다.
        3. buffer를 새로운 빈 List로 설정합니다.
  8. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  9. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  10. result를 반환합니다.

27.1.3.3.2 Iterator.prototype.constructor

Iterator.prototype.constructor는 { [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖는 접근자 프로퍼티입니다. [[Getter]] 및 [[Setter]] 속성은 다음과 같이 정의됩니다:

27.1.3.3.2.1 get Iterator.prototype.constructor

[[Getter]] 속성의 값은 인수를 요구하지 않는 내장 함수입니다. 호출되면 다음 단계를 수행합니다:

  1. %Iterator%를 반환합니다.

27.1.3.3.2.2 set Iterator.prototype.constructor

[[Setter]] 속성의 값은 인수 v를 받는 내장 함수입니다. 호출되면 다음 단계를 수행합니다:

  1. ? SetterThatIgnoresPrototypeProperties(this 값, %Iterator.prototype%, "constructor", v)를 수행합니다.
  2. undefined를 반환합니다.
참고

대부분의 내장 프로토타입의 "constructor" 프로퍼티와 달리 웹 호환성을 위해 이 프로퍼티는 접근자여야 합니다.

27.1.3.3.3 Iterator.prototype.drop ( limit )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. numberLimit을 Completion(ToNumber(limit))으로 둡니다.
  5. IfAbruptCloseIterator(numberLimit, iterated).
  6. numberLimit이 NaN이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  7. numberLimit이 유한하고 numberLimit > 𝔽(253 - 1)이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  8. intLimit을 ! ToIntegerOrInfinity(numberLimit)로 둡니다.
  9. intLimit < 0이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  10. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  11. closure를 매개변수가 없고 iterated와 intLimit을 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. remaining을 𝔽(intLimit)로 둡니다.
    2. remaining > +0𝔽인 동안 다음을 반복합니다.
      1. remaining을 remaining - 1𝔽로 설정합니다.
      2. next를 ? IteratorStep(iterated)로 둡니다.
      3. next가 done이면 ReturnCompletion(undefined)을 반환합니다.
    3. 다음을 반복합니다.
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. value가 done이면 ReturnCompletion(undefined)을 반환합니다.
      3. completion을 Completion(Yield(value))으로 둡니다.
      4. IfAbruptCloseIterator(completion, iterated).
  12. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  13. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  14. result를 반환합니다.

27.1.3.3.4 Iterator.prototype.every ( predicate )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)이 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. counter를 +0𝔽으로 둡니다.
  7. 다음을 반복합니다.
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. value가 done이면 true를 반환합니다.
    3. result를 Completion(Call(predicate, undefined, « value, counter »))으로 둡니다.
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result)이 false이면 ? IteratorClose(iterated, NormalCompletion(false))를 반환합니다.
    6. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
    7. counter를 counter + 1𝔽로 설정합니다.

27.1.3.3.5 Iterator.prototype.filter ( predicate )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)이 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. closure를 매개변수가 없고 iterated와 predicate를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. counter를 +0𝔽으로 둡니다.
    2. 다음을 반복합니다.
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. value가 done이면 ReturnCompletion(undefined)을 반환합니다.
      3. selected를 Completion(Call(predicate, undefined, « value, counter »))으로 둡니다.
      4. IfAbruptCloseIterator(selected, iterated).
      5. ToBoolean(selected)이 true이면, 다음을 수행합니다.
        1. completion을 Completion(Yield(value))으로 둡니다.
        2. IfAbruptCloseIterator(completion, iterated).
      6. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
      7. counter를 counter + 1𝔽로 설정합니다.
  7. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  8. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  9. result를 반환합니다.

27.1.3.3.6 Iterator.prototype.find ( predicate )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)이 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. counter를 +0𝔽으로 둡니다.
  7. 다음을 반복합니다.
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. value가 done이면 undefined를 반환합니다.
    3. result를 Completion(Call(predicate, undefined, « value, counter »))으로 둡니다.
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result)이 true이면 ? IteratorClose(iterated, NormalCompletion(value))를 반환합니다.
    6. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
    7. counter를 counter + 1𝔽로 설정합니다.

27.1.3.3.7 Iterator.prototype.flatMap ( mapper )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(mapper)가 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. closure를 매개변수가 없고 iterated와 mapper를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. counter를 +0𝔽으로 둡니다.
    2. 다음을 반복합니다.
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. value가 done이면 ReturnCompletion(undefined)을 반환합니다.
      3. mapped를 Completion(Call(mapper, undefined, « value, counter »))으로 둡니다.
      4. IfAbruptCloseIterator(mapped, iterated).
      5. innerIterator를 Completion(GetIteratorFlattenable(mapped, reject-primitives))으로 둡니다.
      6. IfAbruptCloseIterator(innerIterator, iterated).
      7. innerAlive를 true로 둡니다.
      8. innerAlive가 true인 동안 다음을 반복합니다.
        1. innerValue를 Completion(IteratorStepValue(innerIterator))으로 둡니다.
        2. IfAbruptCloseIterator(innerValue, iterated).
        3. innerValue가 done이면, 다음을 수행합니다.
          1. innerAlive를 false로 설정합니다.
        4. 그렇지 않으면,
          1. completion을 Completion(Yield(innerValue))으로 둡니다.
          2. completion이 abrupt completion이면, 다음을 수행합니다.
            1. backupCompletion을 Completion(IteratorClose(innerIterator, completion))으로 둡니다.
            2. IfAbruptCloseIterator(backupCompletion, iterated).
            3. ? IteratorClose(iterated, completion)을 반환합니다.
      9. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
      10. counter를 counter + 1𝔽로 설정합니다.
  7. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  8. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  9. result를 반환합니다.

27.1.3.3.8 Iterator.prototype.forEach ( procedure )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(procedure)이 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. counter를 +0𝔽으로 둡니다.
  7. 다음을 반복합니다.
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. value가 done이면 undefined를 반환합니다.
    3. result를 Completion(Call(procedure, undefined, « value, counter »))으로 둡니다.
    4. IfAbruptCloseIterator(result, iterated).
    5. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
    6. counter를 counter + 1𝔽로 설정합니다.

27.1.3.3.9 Iterator.prototype.join ( separator )

이 메서드는 반복자의 값을 String으로 변환한 다음, separator가 나타나는 부분으로 구분하여 이 String들을 연결합니다. 구분자가 제공되지 않으면 단일 쉼표가 구분자로 사용됩니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둔다.
  2. obj가 Object가 아니면 TypeError 예외를 던진다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둔다.
  4. separator가 undefined이면,
    1. separatorString을 ","로 둔다.
  5. 그렇지 않으면,
    1. separatorString을 Completion(ToString(separator))으로 둔다.
    2. IfAbruptCloseIterator(separatorString, iterated).
  6. iterated를 ? GetIteratorDirect(obj)로 설정한다.
  7. result를 빈 String으로 둔다.
  8. first를 true로 둔다.
  9. 반복한다,
    1. value를 ? IteratorStepValue(iterated)로 둔다.
    2. value가 done이면 result를 반환한다.
    3. first가 true이면,
      1. first를 false로 설정한다.
    4. 그렇지 않으면,
      1. result를 result와 separatorString의 string-concatenation으로 설정한다.
    5. value가 undefined도 null도 아니면,
      1. valueString을 Completion(ToString(value))으로 둔다.
      2. IfAbruptCloseIterator(valueString, iterated).
      3. result를 result와 valueString의 string-concatenation으로 설정한다.

27.1.3.3.10 Iterator.prototype.map ( mapper )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(mapper)가 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. closure를 매개변수가 없고 iterated와 mapper를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. counter를 +0𝔽으로 둡니다.
    2. 다음을 반복합니다.
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. value가 done이면 ReturnCompletion(undefined)을 반환합니다.
      3. mapped를 Completion(Call(mapper, undefined, « value, counter »))으로 둡니다.
      4. IfAbruptCloseIterator(mapped, iterated).
      5. completion을 Completion(Yield(mapped))으로 둡니다.
      6. IfAbruptCloseIterator(completion, iterated).
      7. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
      8. counter를 counter + 1𝔽로 설정합니다.
  7. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  8. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  9. result를 반환합니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(reducer)가 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. initialValue가 존재하지 않으면, 다음을 수행합니다.
    1. accumulator를 ? IteratorStepValue(iterated)로 둡니다.
    2. accumulator가 done이면 TypeError 예외를 던집니다.
    3. counter를 1𝔽로 둡니다.
  7. 그렇지 않으면,
    1. accumulator를 initialValue로 둡니다.
    2. counter를 +0𝔽으로 둡니다.
  8. 다음을 반복합니다.
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. value가 done이면 accumulator를 반환합니다.
    3. result를 Completion(Call(reducer, undefined, « accumulator, value, counter »))으로 둡니다.
    4. IfAbruptCloseIterator(result, iterated).
    5. accumulator를 result로 설정합니다.
    6. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
    7. counter를 counter + 1𝔽로 설정합니다.

27.1.3.3.12 Iterator.prototype.some ( predicate )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)이 false이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  6. counter를 +0𝔽으로 둡니다.
  7. 다음을 반복합니다.
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. value가 done이면 false를 반환합니다.
    3. result를 Completion(Call(predicate, undefined, « value, counter »))으로 둡니다.
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result)이 true이면 ? IteratorClose(iterated, NormalCompletion(true))를 반환합니다.
    6. 참고: 다음 단계는 counter가 253𝔽에 도달하면 더 이상 counter를 변경하지 않습니다.
    7. counter를 counter + 1𝔽로 설정합니다.

27.1.3.3.13 Iterator.prototype.take ( limit )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. numberLimit을 Completion(ToNumber(limit))으로 둡니다.
  5. IfAbruptCloseIterator(numberLimit, iterated).
  6. numberLimit이 NaN이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  7. numberLimit이 유한하고 numberLimit > 𝔽(253 - 1)이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  8. intLimit을 ! ToIntegerOrInfinity(numberLimit)로 둡니다.
  9. intLimit < 0이면, 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  10. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  11. closure를 매개변수가 없고 iterated와 intLimit을 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. remaining을 𝔽(intLimit)로 둡니다.
    2. 다음을 반복합니다.
      1. remaining이 +0𝔽이면, 다음을 수행합니다.
        1. ? IteratorClose(iterated, ReturnCompletion(undefined))를 반환합니다.
      2. remaining을 remaining - 1𝔽로 설정합니다.
      3. value를 ? IteratorStepValue(iterated)로 둡니다.
      4. value가 done이면 ReturnCompletion(undefined)을 반환합니다.
      5. completion을 Completion(Yield(value))으로 둡니다.
      6. IfAbruptCloseIterator(completion, iterated).
  12. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  13. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  14. result를 반환합니다.

27.1.3.3.14 Iterator.prototype.toArray ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 ? GetIteratorDirect(obj)로 둡니다.
  4. items를 새로운 빈 List로 둡니다.
  5. 다음을 반복합니다.
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. value가 done이면 CreateArrayFromList(items)를 반환합니다.
    3. value를 items에 추가합니다.

27.1.3.3.15 Iterator.prototype.windows ( windowSize [ , undersized ] )

이 메서드는 호출될 때 다음 단계를 수행합니다.

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iterated를 Iterator 레코드 { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. windowSize가 정수인 Number가 아니면 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  5. windowSize가 1𝔽부터 𝔽(232 - 1)까지 양 끝을 포함하는 구간에 있지 않으면 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  6. undersized가 undefined이면 undersized를 "only-full"로 설정합니다.
  7. undersized가 "only-full"도 "allow-partial"도 아니면 다음을 수행합니다.
    1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
    2. ? IteratorClose(iterated, error)를 반환합니다.
  8. iterated를 ? GetIteratorDirect(obj)로 설정합니다.
  9. closure를 iterated, windowSize, undersized를 캡처하고 매개변수가 없으며 호출될 때 다음 단계를 수행하는 새로운 추상 클로저로 둡니다.
    1. buffer를 새로운 빈 List로 둡니다.
    2. 다음 단계를 반복합니다.
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. value가 done이면 다음을 수행합니다.
        1. undersized가 "allow-partial"이고 buffer가 비어 있지 않으며 buffer의 요소 수가 < ℝ(windowSize)이면 다음을 수행합니다.
          1. Completion(Yield(CreateArrayFromList(buffer)))을 수행합니다.
        2. ReturnCompletion(undefined)를 반환합니다.
      3. buffer의 요소 수가 ℝ(windowSize)이면 다음을 수행합니다.
        1. buffer에서 첫 번째 요소를 제거합니다.
      4. value를 buffer에 추가합니다.
      5. buffer의 요소 수가 ℝ(windowSize)이면 다음을 수행합니다.
        1. completion을 Completion(Yield(CreateArrayFromList(buffer)))으로 둡니다.
        2. IfAbruptCloseIterator(completion, iterated)를 수행합니다.
  10. result를 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  11. result.[[UnderlyingIterators]]를 « iterated »로 설정합니다.
  12. result를 반환합니다.

27.1.3.3.16 Iterator.prototype [ %Symbol.dispose% ] ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. return을 ? GetMethod(obj, "return")으로 둡니다.
  3. return이 undefined가 아니면, 다음을 수행합니다.
    1. ? Call(return, obj)를 수행합니다.
  4. undefined를 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.dispose]"입니다.

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

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

27.1.3.3.18 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%]는 { [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖는 접근자 프로퍼티입니다. [[Getter]] 및 [[Setter]] 속성은 다음과 같이 정의됩니다:

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

[[Getter]] 속성의 값은 인수를 요구하지 않는 내장 함수입니다. 호출되면 다음 단계를 수행합니다:

  1. "Iterator"를 반환합니다.

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

[[Setter]] 속성의 값은 인수 v를 받는 내장 함수입니다. 호출되면 다음 단계를 수행합니다:

  1. ? SetterThatIgnoresPrototypeProperties(this 값, %Iterator.prototype%, %Symbol.toStringTag%, v)를 수행합니다.
  2. undefined를 반환합니다.
참고

대부분의 내장 프로토타입의 %Symbol.toStringTag% 프로퍼티와 달리 웹 호환성을 위해 이 프로퍼티는 접근자여야 합니다.

27.1.3.4 Iterator를 위한 추상 연산

27.1.3.4.1 IteratorZip ( iters, mode, padding, finishResults )

추상 연산 IteratorZip. 인수 iters (리스트 (요소: Iterator 레코드)), mode (("shortest", "longest" 또는 "strict")), padding (리스트 (요소: ECMAScript 언어 값)) 및 finishResults (an Abstract Closure that takes a List of ECMAScript language values and returns an ECMAScript language value). 반환값: Generator. 호출되면 다음 단계를 수행한다.

  1. iterCount를 iters의 요소 수로 둡니다.
  2. openIters를 iters의 복사본으로 둡니다.
  3. closure를 매개변수가 없고 iters, iterCount, openIters, mode, padding, finishResults를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. iterCount = 0이면 ReturnCompletion(undefined)을 반환합니다.
    2. 다음을 반복합니다.
      1. results를 새로운 빈 List로 둡니다.
      2. 단언: openIters는 비어 있지 않습니다.
      3. 0 ≤ i < iterCount를 만족하는 각 정수 i에 대해 오름차순으로 다음을 수행합니다.
        1. iter를 iters[i]로 둡니다.
        2. iter가 null이면, 다음을 수행합니다.
          1. 단언: mode는 "longest"입니다.
          2. result를 padding[i]로 둡니다.
        3. 그렇지 않으면,
          1. result를 Completion(IteratorStepValue(iter))으로 둡니다.
          2. result가 abrupt completion이면, 다음을 수행합니다.
            1. iter를 openIters에서 제거합니다.
            2. ? IteratorCloseAll(openIters, result)을 반환합니다.
          3. result를 ! result로 설정합니다.
          4. result가 done이면, 다음을 수행합니다.
            1. iter를 openIters에서 제거합니다.
            2. mode가 "shortest"이면, 다음을 수행합니다.
              1. ? IteratorCloseAll(openIters, ReturnCompletion(undefined))을 반환합니다.
            3. 그렇지 않고 mode가 "strict"이면, 다음을 수행합니다.
              1. i ≠ 0이면, 다음을 수행합니다.
                1. ? IteratorCloseAll(openIters, ThrowCompletion(새로 생성된 TypeError 객체))를 반환합니다.
              2. 1 ≤ k < iterCount를 만족하는 각 정수 k에 대해 오름차순으로 다음을 수행합니다.
                1. 단언: iters[k]는 null이 아닙니다.
                2. open을 Completion(IteratorStep(iters[k]))으로 둡니다.
                3. open이 abrupt completion이면, 다음을 수행합니다.
                  1. iters[k]를 openIters에서 제거합니다.
                  2. ? IteratorCloseAll(openIters, open)을 반환합니다.
                4. open을 ! open으로 설정합니다.
                5. open이 done이면, 다음을 수행합니다.
                  1. iters[k]를 openIters에서 제거합니다.
                6. 그렇지 않으면,
                  1. ? IteratorCloseAll(openIters, ThrowCompletion(새로 생성된 TypeError 객체))를 반환합니다.
              3. ReturnCompletion(undefined)을 반환합니다.
            4. 그렇지 않으면,
              1. 단언: mode는 "longest"입니다.
              2. openIters가 비어 있으면 ReturnCompletion(undefined)을 반환합니다.
              3. iters[i]를 null로 설정합니다.
              4. result를 padding[i]로 설정합니다.
        4. result를 results에 추가합니다.
      4. results를 finishResults(results)로 설정합니다.
      5. completion을 Completion(Yield(results))으로 둡니다.
      6. IfAbruptCloseIterators(completion, openIters).
  4. gen을 CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)로 둡니다.
  5. gen.[[UnderlyingIterators]]를 openIters로 설정합니다.
  6. gen을 반환합니다.

27.1.4 %AsyncIteratorPrototype% 객체

%AsyncIteratorPrototype% 객체는:

참고

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

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  3. return을 Completion(GetMethod(obj, "return"))으로 둡니다.
  4. IfAbruptRejectPromise(return, promiseCapability).
  5. return이 undefined이면, 다음을 수행합니다.
    1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined »)를 수행합니다.
  6. 그렇지 않으면,
    1. result를 Completion(Call(return, obj, « »))으로 둡니다.
    2. IfAbruptRejectPromise(result, promiseCapability).
    3. resultWrapper를 Completion(PromiseResolve(%Promise%, result))으로 둡니다.
    4. IfAbruptRejectPromise(resultWrapper, promiseCapability).
    5. unwrap을 매개변수가 없고 아무것도 캡처하지 않으며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. undefined를 반환합니다.
    6. onFulfilled를 CreateBuiltinFunction(unwrap, 1, "", « »)로 둡니다.
    7. PerformPromiseThen(resultWrapper, onFulfilled, undefined, promiseCapability)을 수행합니다.
  7. promiseCapability.[[Promise]]를 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.asyncDispose]"입니다.

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "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 객체에는 이름 있는 생성자가 없습니다. 대신 필요할 때 CreateAsyncFromSyncIterator 추상 연산이 Async-from-Sync Iterator 객체를 생성합니다.

27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

추상 연산 CreateAsyncFromSyncIterator. 인수 syncIteratorRecord (Iterator 레코드). 반환값: Iterator 레코드. 동기 Iterator Record에서 async Iterator Record를 생성하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

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

27.1.5.2 %AsyncFromSyncIteratorPrototype% 객체

%AsyncFromSyncIteratorPrototype% 객체는:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. obj를 this 값으로 둡니다.
  2. 단언: obj는 [[SyncIteratorRecord]] 내부 슬롯을 갖는 Object입니다.
  3. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  4. syncIteratorRecord를 obj.[[SyncIteratorRecord]]로 둡니다.
  5. value가 존재하면, 다음을 수행합니다.
    1. result를 Completion(IteratorNext(syncIteratorRecord, value))으로 둡니다.
  6. 그렇지 않으면,
    1. result를 Completion(IteratorNext(syncIteratorRecord))으로 둡니다.
  7. IfAbruptRejectPromise(result, promiseCapability).
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)를 반환합니다.

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. obj를 this 값으로 둡니다.
  2. 단언: obj는 [[SyncIteratorRecord]] 내부 슬롯을 갖는 Object입니다.
  3. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  4. syncIteratorRecord를 obj.[[SyncIteratorRecord]]로 둡니다.
  5. syncIterator를 syncIteratorRecord.[[Iterator]]로 둡니다.
  6. return을 Completion(GetMethod(syncIterator, "return"))으로 둡니다.
  7. IfAbruptRejectPromise(return, promiseCapability).
  8. return이 undefined이면, 다음을 수행합니다.
    1. iteratorResult를 CreateIteratorResultObject(value, true)로 둡니다.
    2. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행합니다.
    3. promiseCapability.[[Promise]]를 반환합니다.
  9. value가 존재하면, 다음을 수행합니다.
    1. result를 Completion(Call(return, syncIterator, « value »))으로 둡니다.
  10. 그렇지 않으면,
    1. result를 Completion(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 ] )

참고
이 명세에서는 value가 항상 제공되지만 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )과의 일관성을 위해 선택적으로 남겨 둡니다.
  1. obj를 this 값으로 둡니다.
  2. 단언: obj는 [[SyncIteratorRecord]] 내부 슬롯을 갖는 Object입니다.
  3. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  4. syncIteratorRecord를 obj.[[SyncIteratorRecord]]로 둡니다.
  5. syncIterator를 syncIteratorRecord.[[Iterator]]로 둡니다.
  6. throw를 Completion(GetMethod(syncIterator, "throw"))으로 둡니다.
  7. IfAbruptRejectPromise(throw, promiseCapability).
  8. throw가 undefined이면, 다음을 수행합니다.
    1. 참고: syncIterator에 throw 메서드가 없으면 capability를 거부하기 전에 정리할 기회를 주기 위해 이를 닫습니다.
    2. closeCompletion을 NormalCompletion(empty)으로 둡니다.
    3. result를 Completion(IteratorClose(syncIteratorRecord, closeCompletion))으로 둡니다.
    4. IfAbruptRejectPromise(result, promiseCapability).
    5. 참고: 다음 단계에서는 프로토콜 위반, 즉 syncIterator에 throw 메서드가 없음을 나타내기 위해 TypeError를 던집니다.
    6. 참고: syncIterator를 닫는 과정에서 예외가 발생하지 않으면, 거부된 promise를 산출하더라도 해당 연산의 결과는 무시됩니다.
    7. ! Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행합니다.
    8. promiseCapability.[[Promise]]를 반환합니다.
  9. value가 존재하면, 다음을 수행합니다.
    1. result를 Completion(Call(throw, syncIterator, « value »))으로 둡니다.
  10. 그렇지 않으면,
    1. result를 Completion(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% 내재 객체에서 프로퍼티를 상속하는 일반 객체입니다. Async-from-Sync Iterator 인스턴스는 처음에 표 86에 나열된 내부 슬롯과 함께 생성됩니다.

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

27.1.5.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

추상 연산 AsyncFromSyncIteratorContinuation. 인수 result (Object), promiseCapability (a PromiseCapability Record for an intrinsic %Promise%), syncIteratorRecord (Iterator 레코드) 및 closeOnRejection (Boolean). 반환값: Promise. 호출되면 다음 단계를 수행한다.

  1. 참고: promiseCapability은 내재 %Promise%에서 파생되므로 아래에서 IfAbruptRejectPromise를 사용함으로써 발생하는 promiseCapability.[[Reject]] 호출은 예외를 던지지 않는 것이 보장됩니다.
  2. done을 Completion(IteratorComplete(result))으로 둡니다.
  3. IfAbruptRejectPromise(done, promiseCapability).
  4. value를 Completion(IteratorValue(result))으로 둡니다.
  5. IfAbruptRejectPromise(value, promiseCapability).
  6. valueWrapper를 Completion(PromiseResolve(%Promise%, value))으로 둡니다.
  7. valueWrapper가 abrupt completion이고 done이 false이며 closeOnRejection이 true이면, 다음을 수행합니다.
    1. valueWrapper를 Completion(IteratorClose(syncIteratorRecord, valueWrapper))으로 설정합니다.
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability).
  9. unwrap을 매개변수 (value)를 가지며 done을 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. CreateIteratorResultObject(value, done)를 반환합니다.
  10. onFulfilled를 CreateBuiltinFunction(unwrap, 1, "", « »)로 둡니다.
  11. 참고: onFulfilled는 IteratorResult 객체의 "value" 프로퍼티를 처리할 때 그 값이 promise인 경우 기다린 뒤 결과를 새로운 “unwrapped” IteratorResult 객체로 다시 패키징하는 데 사용됩니다.
  12. done이 true이거나 closeOnRejection이 false이면, 다음을 수행합니다.
    1. onRejected를 undefined로 둡니다.
  13. 그렇지 않으면,
    1. closeIterator를 매개변수 (error)를 가지며 syncIteratorRecord를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. ? IteratorClose(syncIteratorRecord, ThrowCompletion(error))를 반환합니다.
    2. onRejected를 CreateBuiltinFunction(closeIterator, 1, "", « »)로 둡니다.
    3. 참고: onRejected는 iterator가 산출한 IteratorResult 객체의 "value" 프로퍼티가 거부된 promise인 경우 Iterator를 닫는 데 사용됩니다.
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)을 수행합니다.
  15. promiseCapability.[[Promise]]를 반환합니다.

27.2 리소스 관리

27.2.1 공통 리소스 관리 인터페이스

27.2.1.1 Disposable 인터페이스

Disposable 인터페이스에는 표 87에 설명된 프로퍼티가 포함됩니다:

표 87: Disposable 인터페이스 필수 프로퍼티
프로퍼티 값 요구 사항
%Symbol.dispose% a function object

이 메서드를 호출하면 호출자가 이 객체를 계속 사용할 의도가 없음을 Disposable 객체에 알립니다. 이 메서드는 파일 시스템 핸들, 스트림, 호스트 객체 등을 포함하되 이에 국한되지 않는 리소스의 명시적 정리에 필요한 모든 로직을 수행해야 합니다. 이 메서드에서 예외가 던져지면 일반적으로 리소스를 명시적으로 해제할 수 없었음을 의미합니다.

같은 객체에서 이 메서드를 두 번 이상 호출하는 경우 이미 폐기된 리소스에 대한 정리 로직을 반복하지 않아야 하며, 첫 번째 호출에서 예외가 던져졌더라도 예외를 던져서는 안 됩니다. 그러나 이 요구 사항은 강제되지 않습니다.

Disposable 객체를 using 또는 await using 선언과 함께 사용하는 경우 선언을 직접 포함하는 Block 또는 Module의 평가가 완료되면 리소스가 자동으로 폐기됩니다.

27.2.1.2 AsyncDisposable 인터페이스

AsyncDisposable 인터페이스에는 표 88에 설명된 프로퍼티가 포함됩니다:

표 88: AsyncDisposable 인터페이스 필수 프로퍼티
프로퍼티 값 요구 사항
%Symbol.asyncDispose% a function object that returns a promise

이 메서드를 호출하면 호출자가 이 객체를 계속 사용할 의도가 없음을 AsyncDisposable 객체에 알립니다. 이 메서드는 파일 시스템 핸들, 스트림, 호스트 객체 등을 포함하되 이에 국한되지 않는 리소스의 명시적 정리에 필요한 모든 로직을 수행해야 합니다. 이 메서드가 반환한 promise가 거부되면 일반적으로 리소스를 명시적으로 해제할 수 없었음을 의미합니다. 결과 Promise가 이행될 때까지 AsyncDisposable 객체는 “폐기된” 것으로 간주되지 않습니다.

같은 객체에서 이 메서드를 두 번 이상 호출하는 경우 이미 폐기된 리소스에 대한 정리 로직을 반복하지 않아야 하며, 첫 번째 호출에서 예외가 던져지거나 거부된 promise가 반환되었더라도 예외를 던지거나 거부된 promise를 반환해서는 안 됩니다. 그러나 이 요구 사항은 강제되지 않습니다.

AsyncDisposable 객체를 await using 선언과 함께 사용하는 경우 선언을 직접 포함하는 Block 또는 Module의 평가가 완료되면 리소스가 자동으로 폐기됩니다.

27.3 DisposableStack 객체

DisposableStack은 함께 폐기해야 하는 하나 이상의 리소스를 포함하는 데 사용할 수 있는 객체입니다.

모든 DisposableStack 객체는 서로 배타적인 두 상태 중 하나에 있습니다: disposed 또는 pending. disposable stack d에 대해 d.dispose()와 d.move() 어느 것도 호출되지 않은 경우에만 d는 pending입니다.

27.3.1 DisposableStack 생성자

DisposableStack 생성자는:

  • %DisposableStack%입니다.
  • 전역 객체의 "DisposableStack" 프로퍼티의 초기 값입니다.
  • 생성자로 호출되면 새로운 DisposableStack을 생성하고 초기화합니다.
  • 함수로 호출하도록 의도되지 않았으며 그러한 방식으로 호출되면 예외를 던집니다.
  • 클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 DisposableStack 동작을 상속하려는 하위 클래스 생성자는 DisposableStack.prototype의 내장 메서드를 지원하는 데 필요한 내부 상태로 하위 클래스 인스턴스를 생성하고 초기화하기 위해 DisposableStack 생성자에 대한 super 호출을 포함해야 합니다.

27.3.1.1 DisposableStack ( )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 던집니다.
  2. disposableStack을 ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposableResourceStack]] »)로 둡니다.
  3. disposableStack.[[DisposableState]]를 pending으로 설정합니다.
  4. disposableStack.[[DisposableResourceStack]]을 새로운 빈 List로 설정합니다.
  5. disposableStack을 반환합니다.

27.3.2 DisposableStack 생성자의 프로퍼티

DisposableStack 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

27.3.2.1 DisposableStack.prototype

DisposableStack.prototype의 초기 값은 DisposableStack 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.3.3 DisposableStack 프로토타입 객체의 프로퍼티

DisposableStack 프로토타입 객체는:

  • %DisposableStack.prototype%입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 일반 객체입니다.
  • [[DisposableState]] 내부 슬롯 또는 DisposableStack 인스턴스의 다른 내부 슬롯을 갖지 않습니다.

27.3.3.1 DisposableStack.prototype.adopt ( value, onDispose )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. disposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]])를 수행합니다.
  3. disposableStack.[[DisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. IsCallable(onDispose)이 false이면 TypeError 예외를 던집니다.
  5. closure를 매개변수가 없고 value와 onDispose를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. ? Call(onDispose, undefined, « value »)를 반환합니다.
  6. func를 CreateBuiltinFunction(closure, 0, "", « »)로 둡니다.
  7. ? AddDisposableResource(disposableStack.[[DisposableResourceStack]], undefined, sync-dispose, func)를 수행합니다.
  8. value를 반환합니다.

27.3.3.2 DisposableStack.prototype.constructor

DisposableStack.prototype.constructor의 초기 값은 %DisposableStack%입니다.

27.3.3.3 DisposableStack.prototype.defer ( onDispose )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. disposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]])를 수행합니다.
  3. disposableStack.[[DisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. IsCallable(onDispose)이 false이면 TypeError 예외를 던집니다.
  5. ? AddDisposableResource(disposableStack.[[DisposableResourceStack]], undefined, sync-dispose, onDispose)를 수행합니다.
  6. undefined를 반환합니다.

27.3.3.4 DisposableStack.prototype.dispose ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. disposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]])를 수행합니다.
  3. disposableStack.[[DisposableState]]가 disposed이면 undefined를 반환합니다.
  4. disposableStack.[[DisposableState]]를 disposed로 설정합니다.
  5. ? DisposeResources(disposableStack.[[DisposableResourceStack]], NormalCompletion(undefined))를 반환합니다.

27.3.3.5 get DisposableStack.prototype.disposed

DisposableStack.prototype.disposed는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. disposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]])를 수행합니다.
  3. disposableStack.[[DisposableState]]가 disposed이면 true를 반환합니다.
  4. false를 반환합니다.

27.3.3.6 DisposableStack.prototype.move ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. disposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]])를 수행합니다.
  3. disposableStack.[[DisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. newDisposableStack을 ? OrdinaryCreateFromConstructor(%DisposableStack%, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposableResourceStack]] »)로 둡니다.
  5. newDisposableStack.[[DisposableState]]를 pending으로 설정합니다.
  6. newDisposableStack.[[DisposableResourceStack]]을 disposableStack.[[DisposableResourceStack]]으로 설정합니다.
  7. disposableStack.[[DisposableResourceStack]]을 새로운 빈 List로 설정합니다.
  8. disposableStack.[[DisposableState]]를 disposed로 설정합니다.
  9. newDisposableStack을 반환합니다.

27.3.3.7 DisposableStack.prototype.use ( value )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. disposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]])를 수행합니다.
  3. disposableStack.[[DisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. ? AddDisposableResource(disposableStack.[[DisposableResourceStack]], value, sync-dispose)를 수행합니다.
  5. value를 반환합니다.

27.3.3.8 DisposableStack.prototype [ %Symbol.dispose% ] ( )

%Symbol.dispose% 프로퍼티의 초기 값은 27.3.3.4에 정의된 %DisposableStack.prototype.dispose%입니다.

27.3.3.9 DisposableStack.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "DisposableStack"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.3.4 DisposableStack 인스턴스의 프로퍼티

DisposableStack 인스턴스는 DisposableStack 프로토타입 객체(내재 %DisposableStack.prototype%)에서 프로퍼티를 상속하는 일반 객체입니다. DisposableStack 인스턴스는 처음에 표 89에 설명된 내부 슬롯과 함께 생성됩니다.

표 89: DisposableStack 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[DisposableState]] pending or disposed disposable stack이 %Symbol.dispose% 메서드에 대한 들어오는 호출에 어떻게 반응할지를 제어합니다.
[[DisposableResourceStack]] a List of DisposableResource Records disposable stack이 폐기될 때 폐기해야 하는 리소스입니다. 리소스는 초기화되는 순서로 추가되며 역순으로 폐기됩니다.

27.4 AsyncDisposableStack 객체

AsyncDisposableStack은 함께 비동기적으로 폐기해야 하는 하나 이상의 리소스를 포함하는 데 사용할 수 있는 객체입니다.

모든 AsyncDisposableStack 객체는 서로 배타적인 두 상태 중 하나에 있습니다: disposed 또는 pending. async-disposable stack d에 대해 d.disposeAsync()와 d.move() 어느 것도 호출되지 않은 경우에만 d는 pending입니다.

27.4.1 AsyncDisposableStack 생성자

AsyncDisposableStack 생성자는:

  • %AsyncDisposableStack%입니다.
  • 전역 객체의 "AsyncDisposableStack" 프로퍼티의 초기 값입니다.
  • 생성자로 호출되면 새로운 AsyncDisposableStack을 생성하고 초기화합니다.
  • 함수로 호출하도록 의도되지 않았으며 그러한 방식으로 호출되면 예외를 던집니다.
  • 클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 AsyncDisposableStack 동작을 상속하려는 하위 클래스 생성자는 AsyncDisposableStack.prototype의 내장 메서드를 지원하는 데 필요한 내부 상태로 하위 클래스 인스턴스를 생성하고 초기화하기 위해 AsyncDisposableStack 생성자에 대한 super 호출을 포함해야 합니다.

27.4.1.1 AsyncDisposableStack ( )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 던집니다.
  2. asyncDisposableStack을 ? OrdinaryCreateFromConstructor(NewTarget, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposableResourceStack]] »)로 둡니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]를 pending으로 설정합니다.
  4. asyncDisposableStack.[[DisposableResourceStack]]을 새로운 빈 List로 설정합니다.
  5. asyncDisposableStack을 반환합니다.

27.4.2 AsyncDisposableStack 생성자의 프로퍼티

AsyncDisposableStack 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

27.4.2.1 AsyncDisposableStack.prototype

AsyncDisposableStack.prototype의 초기 값은 AsyncDisposableStack 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.4.3 AsyncDisposableStack 프로토타입 객체의 프로퍼티

AsyncDisposableStack 프로토타입 객체는:

  • %AsyncDisposableStack.prototype%입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 일반 객체입니다.
  • [[AsyncDisposableState]] 내부 슬롯 또는 AsyncDisposableStack 인스턴스의 다른 내부 슬롯을 갖지 않습니다.

27.4.3.1 AsyncDisposableStack.prototype.adopt ( value, onDisposeAsync )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. asyncDisposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]])를 수행합니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. IsCallable(onDisposeAsync)가 false이면 TypeError 예외를 던집니다.
  5. closure를 매개변수가 없고 value와 onDisposeAsync를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. ? Call(onDisposeAsync, undefined, « value »)를 반환합니다.
  6. func를 CreateBuiltinFunction(closure, 0, "", « »)로 둡니다.
  7. ? AddDisposableResource(asyncDisposableStack.[[DisposableResourceStack]], undefined, async-dispose, func)를 수행합니다.
  8. value를 반환합니다.

27.4.3.2 AsyncDisposableStack.prototype.constructor

AsyncDisposableStack.prototype.constructor의 초기 값은 %AsyncDisposableStack%입니다.

27.4.3.3 AsyncDisposableStack.prototype.defer ( onDisposeAsync )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. asyncDisposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]])를 수행합니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. IsCallable(onDisposeAsync)가 false이면 TypeError 예외를 던집니다.
  5. ? AddDisposableResource(asyncDisposableStack.[[DisposableResourceStack]], undefined, async-dispose, onDisposeAsync)를 수행합니다.
  6. undefined를 반환합니다.

27.4.3.4 AsyncDisposableStack.prototype.disposeAsync ( )

이 async 메서드는 호출되면 다음 단계를 수행합니다:

  1. asyncDisposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]])를 수행합니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]가 disposed이면 undefined를 반환합니다.
  4. asyncDisposableStack.[[AsyncDisposableState]]를 disposed로 설정합니다.
  5. ? DisposeResources(asyncDisposableStack.[[DisposableResourceStack]], NormalCompletion(undefined))를 반환합니다.

27.4.3.5 get AsyncDisposableStack.prototype.disposed

AsyncDisposableStack.prototype.disposed는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. asyncDisposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]])를 수행합니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]가 disposed이면 true를 반환합니다.
  4. false를 반환합니다.

27.4.3.6 AsyncDisposableStack.prototype.move ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. asyncDisposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]])를 수행합니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. newAsyncDisposableStack을 ? OrdinaryCreateFromConstructor(%AsyncDisposableStack%, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposableResourceStack]] »)로 둡니다.
  5. newAsyncDisposableStack.[[AsyncDisposableState]]를 pending으로 설정합니다.
  6. newAsyncDisposableStack.[[DisposableResourceStack]]을 asyncDisposableStack.[[DisposableResourceStack]]으로 설정합니다.
  7. asyncDisposableStack.[[DisposableResourceStack]]을 새로운 빈 List로 설정합니다.
  8. asyncDisposableStack.[[AsyncDisposableState]]를 disposed로 설정합니다.
  9. newAsyncDisposableStack을 반환합니다.

27.4.3.7 AsyncDisposableStack.prototype.use ( value )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. asyncDisposableStack을 this 값으로 둡니다.
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]])를 수행합니다.
  3. asyncDisposableStack.[[AsyncDisposableState]]가 disposed이면 ReferenceError 예외를 던집니다.
  4. ? AddDisposableResource(asyncDisposableStack.[[DisposableResourceStack]], value, async-dispose)를 수행합니다.
  5. value를 반환합니다.

27.4.3.8 AsyncDisposableStack.prototype [ %Symbol.asyncDispose% ] ( )

%Symbol.asyncDispose% 프로퍼티의 초기 값은 27.4.3.4에 정의된 %AsyncDisposableStack.prototype.disposeAsync%입니다.

27.4.3.9 AsyncDisposableStack.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "AsyncDisposableStack"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.4.4 AsyncDisposableStack 인스턴스의 프로퍼티

AsyncDisposableStack 인스턴스는 AsyncDisposableStack 프로토타입 객체(내재 %AsyncDisposableStack.prototype%)에서 프로퍼티를 상속하는 일반 객체입니다. AsyncDisposableStack 인스턴스는 처음에 표 90에 설명된 내부 슬롯과 함께 생성됩니다.

표 90: AsyncDisposableStack 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[AsyncDisposableState]] pending or disposed disposable stack이 %Symbol.asyncDispose% 메서드에 대한 들어오는 호출에 어떻게 반응할지를 제어합니다.
[[DisposableResourceStack]] a List of DisposableResource Records disposable stack이 폐기될 때 폐기해야 하는 리소스입니다. 리소스는 초기화되는 순서로 추가되며 역순으로 폐기됩니다.

27.5 Promise 객체

Promise는 지연된(그리고 비동기일 수 있는) 계산의 최종 결과를 위한 자리 표시자로 사용되는 객체입니다.

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

  • promise p에 대해 p.then(f, r)이 함수 f를 호출하는 Job을 즉시 큐에 넣는다면 p는 fulfilled입니다.
  • promise p에 대해 p.then(f, r)이 함수 r을 호출하는 Job을 즉시 큐에 넣는다면 p는 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일 수 있습니다.

thenable은 Get(obj, "then")이 function object를 반환하는 객체 obj입니다.

27.5.1 Promise 추상 연산

27.5.1.1 PromiseCapability Records

PromiseCapability Record는 Promise 또는 promise와 유사한 객체와 함께 해당 promise를 resolve하거나 reject할 수 있는 함수를 캡슐화하는 데 사용되는 Record입니다. PromiseCapability Records는 NewPromiseCapability 추상 연산에 의해 생성됩니다.

PromiseCapability Records에는 표 91에 나열된 필드가 있습니다.

표 91: PromiseCapability Record 필드
필드 이름 값 의미
[[Promise]] an Object promise로 사용할 수 있는 객체입니다.
[[Resolve]] a function object 주어진 promise를 resolve하는 데 사용되는 함수입니다.
[[Reject]] a function object 주어진 promise를 reject하는 데 사용되는 함수입니다.

27.5.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise는 PromiseCapability Record를 사용하는 일련의 알고리즘 단계에 대한 축약 표현입니다. 다음 형식의 알고리즘 단계:

  1. IfAbruptRejectPromise(value, capability).

는 다음과 같은 의미입니다:

  1. 단언: value는 Completion Record입니다.
  2. value가 abrupt completion이면, 다음을 수행합니다.
    1. ? Call(capability.[[Reject]], undefined, « value.[[Value]] »)를 수행합니다.
    2. capability.[[Promise]]를 반환합니다.
  3. value를 ! value로 설정합니다.

27.5.1.2 PromiseReaction Records

PromiseReaction Record는 promise가 주어진 값으로 resolve되거나 reject될 때 어떻게 반응해야 하는지에 대한 정보를 저장하는 데 사용되는 Record입니다. PromiseReaction Records는 PerformPromiseThen 추상 연산에 의해 생성되며 NewPromiseReactionJob이 반환하는 Abstract Closure에서 사용됩니다.

PromiseReaction Records에는 표 92에 나열된 필드가 있습니다.

표 92: PromiseReaction Record 필드
필드 이름 값 의미
[[Capability]] a PromiseCapability Record or undefined 이 Record가 reaction handler를 제공하는 promise의 capability입니다.
[[Type]] fulfill or reject [[Handler]]가 empty일 때 settlement type에 특화된 동작을 허용하기 위해 [[Type]]을 사용합니다.
[[Handler]] a JobCallback Record or empty 들어오는 값에 적용해야 하는 함수이며 그 반환 값에 따라 파생 promise에 어떤 일이 발생할지가 결정됩니다. [[Handler]]가 empty이면 대신 [[Type]] 값에 따라 달라지는 함수를 사용합니다.

27.5.1.3 CreateResolvingFunctions ( toResolve )

추상 연산 CreateResolvingFunctions. 인수 toResolve (Promise). 반환값: 레코드 (필드: [[Resolve]] (함수 객체), [[Reject]] (함수 객체)). 호출되면 다음 단계를 수행한다.

  1. promiseOrEmpty를 Record { [[Value]]: toResolve }로 둡니다.
  2. resolveSteps를 매개변수 (resolution)을 가지며 promiseOrEmpty를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. promiseOrEmpty.[[Value]]가 empty이면 undefined를 반환합니다.
    2. promise를 promiseOrEmpty.[[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. then을 Completion(Get(resolution, "then"))으로 둡니다.
    7. then이 abrupt completion이면, 다음을 수행합니다.
      1. RejectPromise(promise, then.[[Value]])를 수행합니다.
      2. undefined를 반환합니다.
    8. thenAction을 then.[[Value]]로 둡니다.
    9. IsCallable(thenAction)이 false이면, 다음을 수행합니다.
      1. FulfillPromise(promise, resolution)을 수행합니다.
      2. undefined를 반환합니다.
    10. thenJobCallback을 HostMakeJobCallback(thenAction)으로 둡니다.
    11. job을 NewPromiseResolveThenableJob(promise, resolution, thenJobCallback)으로 둡니다.
    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])을 수행합니다.
    13. undefined를 반환합니다.
  3. resolve를 CreateBuiltinFunction(resolveSteps, 1, "", « »)로 둡니다.
  4. rejectSteps를 매개변수 (reason)을 가지며 promiseOrEmpty를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. promiseOrEmpty.[[Value]]가 empty이면 undefined를 반환합니다.
    2. promise를 promiseOrEmpty.[[Value]]로 둡니다.
    3. promiseOrEmpty.[[Value]]를 empty로 설정합니다.
    4. RejectPromise(promise, reason)을 수행합니다.
    5. undefined를 반환합니다.
  5. reject를 CreateBuiltinFunction(rejectSteps, 1, "", « »)로 둡니다.
  6. Record { [[Resolve]]: resolve, [[Reject]]: reject }를 반환합니다.

27.5.1.4 FulfillPromise ( promise, value )

추상 연산 FulfillPromise. 인수 promise (Promise) 및 value (ECMAScript 언어 값). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: promise.[[PromiseState]]는 pending입니다.
  2. reactions를 promise.[[PromiseFulfillReactions]]로 둡니다.
  3. promise.[[PromiseResult]]를 value로 설정합니다.
  4. promise.[[PromiseFulfillReactions]]를 undefined로 설정합니다.
  5. promise.[[PromiseRejectReactions]]를 undefined로 설정합니다.
  6. promise.[[PromiseState]]를 fulfilled로 설정합니다.
  7. TriggerPromiseReactions(reactions, value)를 수행합니다.
  8. unused를 반환합니다.

27.5.1.5 NewPromiseCapability ( ctor )

추상 연산 NewPromiseCapability. 인수 ctor (ECMAScript 언어 값). 반환값: (정상 완료 (값: PromiseCapability 레코드) 또는 throw 완료). 내장 Promise 생성자와 같은 방식으로 ctor를 생성자로 사용하여 promise를 생성하고 그 resolve 및 reject 함수를 추출하려고 시도합니다. promise와 resolve, reject 함수는 새로운 PromiseCapability Record를 초기화하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. IsConstructor(ctor)가 false이면 TypeError 예외를 던집니다.
  2. 참고: ctor는 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수라고 가정합니다(27.5.3.1 참조).
  3. resolvingFuncs를 Record { [[Resolve]]: undefined, [[Reject]]: undefined }로 둡니다.
  4. executorClosure를 매개변수 (resolve, reject)를 가지며 resolvingFuncs를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. resolvingFuncs.[[Resolve]]가 undefined가 아니면 TypeError 예외를 던집니다.
    2. resolvingFuncs.[[Reject]]가 undefined가 아니면 TypeError 예외를 던집니다.
    3. resolvingFuncs.[[Resolve]]를 resolve로 설정합니다.
    4. resolvingFuncs.[[Reject]]를 reject로 설정합니다.
    5. NormalCompletion(undefined)을 반환합니다.
  5. executor를 CreateBuiltinFunction(executorClosure, 2, "", « »)로 둡니다.
  6. promise를 ? Construct(ctor, « executor »)로 둡니다.
  7. IsCallable(resolvingFuncs.[[Resolve]])가 false이면 TypeError 예외를 던집니다.
  8. IsCallable(resolvingFuncs.[[Reject]])가 false이면 TypeError 예외를 던집니다.
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFuncs.[[Resolve]], [[Reject]]: resolvingFuncs.[[Reject]] }를 반환합니다.
참고

이 추상 연산은 전달된 executor 함수 인수를 Promise 생성자와 같은 방식으로 호출하는 모든 생성자에 대해 일반적으로 동작하므로 Promise 하위 클래싱을 지원합니다. Promise 생성자의 정적 메서드를 모든 하위 클래스로 일반화하는 데 사용됩니다.

27.5.1.6 IsPromise ( arg )

추상 연산 IsPromise. 인수 arg (ECMAScript 언어 값). 반환값: Boolean. 객체에 promise 브랜드가 있는지 검사합니다. 호출되면 다음 단계를 수행한다.

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

27.5.1.7 RejectPromise ( promise, reason )

추상 연산 RejectPromise. 인수 promise (Promise) 및 reason (ECMAScript 언어 값). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: promise.[[PromiseState]]는 pending입니다.
  2. reactions를 promise.[[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.5.1.8 TriggerPromiseReactions ( reactions, arg )

추상 연산 TriggerPromiseReactions. 인수 reactions (리스트 (요소: PromiseReaction 레코드)) 및 arg (ECMAScript 언어 값). 반환값: unused. reactions의 각 Record에 대해 새로운 Job을 큐에 넣습니다. 각 Job은 PromiseReaction Record의 [[Type]] 및 [[Handler]]를 처리하고, [[Handler]]가 empty가 아니면 주어진 인수를 전달하여 호출합니다. [[Handler]]가 empty이면 동작은 [[Type]]에 의해 결정됩니다. 호출되면 다음 단계를 수행한다.

  1. reactions의 각 요소 reaction에 대해 다음을 수행합니다.
    1. job을 NewPromiseReactionJob(reaction, arg)으로 둡니다.
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])을 수행합니다.
  2. unused를 반환합니다.

27.5.1.9 HostPromiseRejectionTracker ( promise, operation )

호스트 정의 추상 연산 HostPromiseRejectionTracker. 인수 promise (Promise) 및 operation (("reject" 또는 "handle")). 반환값: unused. 호스트 환경이 promise rejection을 추적할 수 있도록 합니다.

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

참고 1

HostPromiseRejectionTracker는 두 가지 상황에서 호출됩니다:

  • promise가 handler 없이 reject되면 operation 인수를 "reject"로 설정하여 호출합니다.
  • reject된 promise에 처음으로 handler가 추가되면 operation 인수를 "handle"로 설정하여 호출합니다.

일반적인 HostPromiseRejectionTracker 구현은 처리되지 않은 rejection을 개발자에게 알리려고 하면서도, 나중에 새로운 handler가 연결되어 이전 알림이 더 이상 유효하지 않게 된 경우에도 이를 알리도록 주의할 수 있습니다.

참고 2

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

27.5.2 Promise 작업

27.5.2.1 NewPromiseReactionJob ( reaction, arg )

추상 연산 NewPromiseReactionJob. 인수 reaction (PromiseReaction 레코드) 및 arg (ECMAScript 언어 값). 반환값: 레코드 (필드: [[Job]] (a Job Abstract Closure), [[Realm]] ((Realm 레코드 또는 null))). 들어오는 값에 적절한 handler를 적용하고 handler의 반환 값을 사용하여 해당 handler와 연결된 파생 promise를 resolve하거나 reject하는 새로운 Job Abstract Closure를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. job을 매개변수가 없고 reaction과 arg를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Job Abstract Closure로 둡니다:
    1. promiseCapability을 reaction.[[Capability]]로 둡니다.
    2. type을 reaction.[[Type]]으로 둡니다.
    3. handler를 reaction.[[Handler]]로 둡니다.
    4. handler가 empty이면, 다음을 수행합니다.
      1. type이 fulfill이면, 다음을 수행합니다.
        1. handlerResult를 NormalCompletion(arg)으로 둡니다.
      2. 그렇지 않으면,
        1. 단언: type은 reject입니다.
        2. handlerResult를 ThrowCompletion(arg)으로 둡니다.
    5. 그렇지 않으면,
      1. handlerResult를 Completion(HostCallJobCallback(handler, undefined, « arg »))으로 둡니다.
    6. promiseCapability이 undefined이면, 다음을 수행합니다.
      1. 단언: handlerResult는 abrupt completion이 아닙니다.
      2. empty를 반환합니다.
    7. 단언: promiseCapability은 PromiseCapability Record입니다.
    8. handlerResult가 abrupt completion이면, 다음을 수행합니다.
      1. ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] »)를 반환합니다.
    9. ? Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] »)를 반환합니다.
  2. handlerRealm을 null로 둡니다.
  3. reaction.[[Handler]]가 empty가 아니면, 다음을 수행합니다.
    1. getHandlerRealmResult를 Completion(GetFunctionRealm(reaction.[[Handler]].[[Callback]]))으로 둡니다.
    2. getHandlerRealmResult가 normal completion이면 handlerRealm을 getHandlerRealmResult.[[Value]]로 설정합니다.
    3. 그렇지 않으면 handlerRealm을 현재 Realm Record로 설정합니다.
    4. 참고: handler가 undefined인 경우를 제외하면 handlerRealm은 절대 null이 아닙니다. handler가 폐기된 Proxy이고 ECMAScript 코드가 실행되지 않는 경우 handlerRealm은 오류 객체를 생성하는 데 사용됩니다.
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm }를 반환합니다.

27.5.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

추상 연산 NewPromiseResolveThenableJob. 인수 promiseToResolve (Promise), thenable (Object) 및 then (JobCallback 레코드). 반환값: 레코드 (필드: [[Job]] (a Job Abstract Closure), [[Realm]] (Realm 레코드)). 호출되면 다음 단계를 수행한다.

  1. job을 매개변수가 없고 promiseToResolve, thenable, then을 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Job Abstract Closure로 둡니다:
    1. resolvingFuncs를 CreateResolvingFunctions(promiseToResolve)로 둡니다.
    2. thenCallResult를 Completion(HostCallJobCallback(then, thenable, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »))으로 둡니다.
    3. thenCallResult가 abrupt completion이면, 다음을 수행합니다.
      1. ? Call(resolvingFuncs.[[Reject]], undefined, « thenCallResult.[[Value]] »)를 반환합니다.
    4. ! thenCallResult를 반환합니다.
  2. getThenRealmResult를 Completion(GetFunctionRealm(then.[[Callback]]))으로 둡니다.
  3. getThenRealmResult가 normal completion이면 thenRealm을 getThenRealmResult.[[Value]]로 둡니다.
  4. 그렇지 않으면 thenRealm을 현재 Realm Record로 둡니다.
  5. 참고: thenRealm은 절대 null이 아닙니다. then.[[Callback]]이 폐기된 Proxy이고 코드가 실행되지 않는 경우 thenRealm은 오류 객체를 생성하는 데 사용됩니다.
  6. Record { [[Job]]: job, [[Realm]]: thenRealm }를 반환합니다.
참고

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

27.5.3 Promise 생성자

Promise 생성자는:

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

27.5.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. resolvingFuncs를 CreateResolvingFunctions(promise)로 둡니다.
  10. completion을 Completion(Call(executor, undefined, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »))으로 둡니다.
  11. completion이 abrupt completion이면, 다음을 수행합니다.
    1. ? Call(resolvingFuncs.[[Reject]], undefined, « completion.[[Value]] »)를 수행합니다.
  12. promise를 반환합니다.
참고

executor 인수는 function object여야 합니다. 이 Promise가 나타내는 지연될 수 있는 동작의 시작과 완료를 보고하기 위해 호출됩니다. executor는 두 인수 resolve와 reject로 호출됩니다. 이 함수들은 executor 함수가 지연된 계산의 최종 완료 또는 실패를 보고하는 데 사용할 수 있습니다. executor 함수에서 반환한다고 해서 지연된 동작이 완료되었다는 의미는 아니며, 단지 지연된 동작을 최종적으로 수행하라는 요청이 수락되었다는 의미입니다.

executor 함수에 전달되는 resolve 함수는 하나의 인수를 받습니다. executor 코드는 연결된 Promise를 resolve하려 함을 나타내기 위해 최종적으로 resolve 함수를 호출할 수 있습니다. resolve 함수에 전달되는 인수는 지연된 동작의 최종 값을 나타내며 실제 이행 값이거나, 이행되면 값을 제공할 다른 promise일 수 있습니다.

executor 함수에 전달되는 reject 함수는 하나의 인수를 받습니다. executor 코드는 연결된 Promise가 reject되었고 절대 fulfilled되지 않을 것임을 나타내기 위해 최종적으로 reject 함수를 호출할 수 있습니다. reject 함수에 전달되는 인수는 promise의 rejection 값으로 사용됩니다. 일반적으로 Error 객체입니다.

Promise 생성자가 executor 함수에 전달하는 resolve 및 reject 함수는 연결된 promise를 실제로 resolve하고 reject할 수 있습니다. 하위 클래스는 resolve 및 reject에 사용자 정의 값을 전달하는 다른 생성자 동작을 가질 수 있습니다.

27.5.4 Promise 생성자의 프로퍼티

Promise 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

27.5.4.1 Promise.all ( iterable )

이 함수는 전달된 promise들의 이행 값 배열로 fulfilled되는 새로운 promise를 반환하거나, 처음 reject된 전달 promise의 이유로 reject됩니다. 이 알고리즘을 실행하면서 전달된 iterable의 모든 요소를 promise로 resolve합니다.

  1. ctor를 this 값으로 둡니다.
  2. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  3. promiseResolve를 Completion(GetPromiseResolve(ctor))으로 둡니다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecord를 Completion(GetIterator(iterable, sync))으로 둡니다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. result를 Completion(PerformPromiseAll(iteratorRecord, ctor, promiseCapability, promiseResolve))으로 둡니다.
  8. result가 abrupt completion이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]이 false이면 result를 Completion(IteratorClose(iteratorRecord, result))으로 설정합니다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. ! result를 반환합니다.
참고

이 함수의 this 값은 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수여야 합니다.

27.5.4.1.1 GetPromiseResolve ( promiseCtor )

추상 연산 GetPromiseResolve. 인수 promiseCtor (생성자). 반환값: (정상 완료 (값: 함수 객체) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. promiseResolve를 ? Get(promiseCtor, "resolve")로 둡니다.
  2. IsCallable(promiseResolve)가 false이면 TypeError 예외를 던집니다.
  3. promiseResolve를 반환합니다.

27.5.4.1.2 PerformPromiseAll ( iteratorRecord, ctor, resultCapability, promiseResolve )

추상 연산 PerformPromiseAll. 인수 iteratorRecord (Iterator 레코드), ctor (생성자), resultCapability (PromiseCapability 레코드) 및 promiseResolve (함수 객체). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. values를 새로운 빈 List로 둡니다.
  2. 참고: 입력 iterator가 소진되기 전에 전달된 콜백을 호출하는 잘못 동작하는 "then"이 존재하더라도 resultCapability.[[Resolve]]가 한 번만 호출되도록 remainingElementsCount는 0이 아니라 1에서 시작합니다.
  3. remainingElementsCount를 Record { [[Value]]: 1 }로 둡니다.
  4. index를 0으로 둡니다.
  5. 다음을 반복합니다.
    1. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
    2. next가 done이면, 다음을 수행합니다.
      1. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] - 1로 설정합니다.
      2. remainingElementsCount.[[Value]] = 0이면, 다음을 수행합니다.
        1. valuesArray를 CreateArrayFromList(values)로 둡니다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 수행합니다.
      3. resultCapability.[[Promise]]를 반환합니다.
    3. undefined를 values에 추가합니다.
    4. nextPromise를 ? Call(promiseResolve, ctor, « next »)로 둡니다.
    5. fulfilledSteps를 매개변수 (value)를 가지며 values, resultCapability, remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. activeFunc를 활성 함수 객체로 둡니다.
      2. activeFunc.[[AlreadyCalled]]가 true이면 undefined를 반환합니다.
      3. activeFunc.[[AlreadyCalled]]를 true로 설정합니다.
      4. thisIndex를 activeFunc.[[Index]]로 둡니다.
      5. values[thisIndex]를 value로 설정합니다.
      6. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] - 1로 설정합니다.
      7. remainingElementsCount.[[Value]] = 0이면, 다음을 수행합니다.
        1. valuesArray를 CreateArrayFromList(values)로 둡니다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 반환합니다.
      8. undefined를 반환합니다.
    6. onFulfilled를 CreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둡니다.
    7. onFulfilled.[[AlreadyCalled]]를 false로 설정합니다.
    8. onFulfilled.[[Index]]를 index로 설정합니다.
    9. index를 index + 1로 설정합니다.
    10. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] + 1로 설정합니다.
    11. ? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] »)를 수행합니다.

27.5.4.2 Promise.allSettled ( iterable )

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

  1. ctor를 this 값으로 둡니다.
  2. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  3. promiseResolve를 Completion(GetPromiseResolve(ctor))으로 둡니다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecord를 Completion(GetIterator(iterable, sync))으로 둡니다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. result를 Completion(PerformPromiseAllSettled(iteratorRecord, ctor, promiseCapability, promiseResolve))으로 둡니다.
  8. result가 abrupt completion이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]이 false이면 result를 Completion(IteratorClose(iteratorRecord, result))으로 설정합니다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. ! result를 반환합니다.
참고

이 함수의 this 값은 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수여야 합니다.

27.5.4.2.1 PerformPromiseAllSettled ( iteratorRecord, ctor, resultCapability, promiseResolve )

추상 연산 PerformPromiseAllSettled. 인수 iteratorRecord (Iterator 레코드), ctor (생성자), resultCapability (PromiseCapability 레코드) 및 promiseResolve (함수 객체). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. values를 새로운 빈 List로 둡니다.
  2. 참고: 입력 iterator가 소진되기 전에 전달된 콜백 중 하나를 호출하는 잘못 동작하는 "then"이 존재하더라도 resultCapability.[[Resolve]]가 한 번만 호출되도록 remainingElementsCount는 0이 아니라 1에서 시작합니다.
  3. remainingElementsCount를 Record { [[Value]]: 1 }로 둡니다.
  4. index를 0으로 둡니다.
  5. 다음을 반복합니다.
    1. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
    2. next가 done이면, 다음을 수행합니다.
      1. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] - 1로 설정합니다.
      2. remainingElementsCount.[[Value]] = 0이면, 다음을 수행합니다.
        1. valuesArray를 CreateArrayFromList(values)로 둡니다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 수행합니다.
      3. resultCapability.[[Promise]]를 반환합니다.
    3. undefined를 values에 추가합니다.
    4. nextPromise를 ? Call(promiseResolve, ctor, « next »)로 둡니다.
    5. alreadyCalled를 Record { [[Value]]: false }로 둡니다.
    6. fulfilledSteps를 매개변수 (value)를 가지며 values, resultCapability, remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. activeFunc를 활성 함수 객체로 둡니다.
      2. activeFunc.[[AlreadyCalled]].[[Value]]가 true이면 undefined를 반환합니다.
      3. activeFunc.[[AlreadyCalled]].[[Value]]를 true로 설정합니다.
      4. obj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
      5. ! CreateDataPropertyOrThrow(obj, "status", "fulfilled")를 수행합니다.
      6. ! CreateDataPropertyOrThrow(obj, "value", value)를 수행합니다.
      7. thisIndex를 activeFunc.[[Index]]로 둡니다.
      8. values[thisIndex]를 obj로 설정합니다.
      9. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] - 1로 설정합니다.
      10. remainingElementsCount.[[Value]] = 0이면, 다음을 수행합니다.
        1. valuesArray를 CreateArrayFromList(values)로 둡니다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 반환합니다.
      11. undefined를 반환합니다.
    7. onFulfilled를 CreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둡니다.
    8. onFulfilled.[[AlreadyCalled]]를 alreadyCalled로 설정합니다.
    9. onFulfilled.[[Index]]를 index로 설정합니다.
    10. rejectedSteps를 매개변수 (error)를 가지며 values, resultCapability, remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. activeFunc를 활성 함수 객체로 둡니다.
      2. activeFunc.[[AlreadyCalled]].[[Value]]가 true이면 undefined를 반환합니다.
      3. activeFunc.[[AlreadyCalled]].[[Value]]를 true로 설정합니다.
      4. obj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
      5. ! CreateDataPropertyOrThrow(obj, "status", "rejected")를 수행합니다.
      6. ! CreateDataPropertyOrThrow(obj, "reason", error)를 수행합니다.
      7. thisIndex를 activeFunc.[[Index]]로 둡니다.
      8. values[thisIndex]를 obj로 설정합니다.
      9. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] - 1로 설정합니다.
      10. remainingElementsCount.[[Value]] = 0이면, 다음을 수행합니다.
        1. valuesArray를 CreateArrayFromList(values)로 둡니다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 반환합니다.
      11. undefined를 반환합니다.
    11. onRejected를 CreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둡니다.
    12. onRejected.[[AlreadyCalled]]를 alreadyCalled로 설정합니다.
    13. onRejected.[[Index]]를 index로 설정합니다.
    14. index를 index + 1로 설정합니다.
    15. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] + 1로 설정합니다.
    16. ? Invoke(nextPromise, "then", « onFulfilled, onRejected »)를 수행합니다.

27.5.4.3 Promise.any ( iterable )

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

  1. ctor를 this 값으로 둡니다.
  2. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  3. promiseResolve를 Completion(GetPromiseResolve(ctor))으로 둡니다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecord를 Completion(GetIterator(iterable, sync))으로 둡니다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. result를 Completion(PerformPromiseAny(iteratorRecord, ctor, promiseCapability, promiseResolve))으로 둡니다.
  8. result가 abrupt completion이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]이 false이면 result를 Completion(IteratorClose(iteratorRecord, result))으로 설정합니다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. ! result를 반환합니다.
참고

이 함수의 this 값은 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수여야 합니다.

27.5.4.3.1 PerformPromiseAny ( iteratorRecord, ctor, resultCapability, promiseResolve )

추상 연산 PerformPromiseAny. 인수 iteratorRecord (Iterator 레코드), ctor (생성자), resultCapability (PromiseCapability 레코드) 및 promiseResolve (함수 객체). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. errors를 새로운 빈 List로 둡니다.
  2. 참고: 입력 iterator가 소진되기 전에 전달된 콜백을 호출하는 잘못 동작하는 "then"이 존재하더라도 resultCapability.[[Reject]]가 한 번만 호출되도록 remainingElementsCount는 0이 아니라 1에서 시작합니다.
  3. remainingElementsCount를 Record { [[Value]]: 1 }로 둡니다.
  4. index를 0으로 둡니다.
  5. 다음을 반복합니다.
    1. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
    2. next가 done이면, 다음을 수행합니다.
      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. undefined를 errors에 추가합니다.
    4. nextPromise를 ? Call(promiseResolve, ctor, « next »)로 둡니다.
    5. rejectedSteps를 매개변수 (error)를 가지며 errors, resultCapability, remainingElementsCount를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. activeFunc를 활성 함수 객체로 둡니다.
      2. activeFunc.[[AlreadyCalled]]가 true이면 undefined를 반환합니다.
      3. activeFunc.[[AlreadyCalled]]를 true로 설정합니다.
      4. thisIndex를 activeFunc.[[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. onRejected를 CreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)로 둡니다.
    7. onRejected.[[AlreadyCalled]]를 false로 설정합니다.
    8. onRejected.[[Index]]를 index로 설정합니다.
    9. index를 index + 1로 설정합니다.
    10. remainingElementsCount.[[Value]]를 remainingElementsCount.[[Value]] + 1로 설정합니다.
    11. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected »)를 수행합니다.

27.5.4.4 Promise.prototype

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.5.4.5 Promise.race ( iterable )

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

  1. ctor를 this 값으로 둡니다.
  2. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  3. promiseResolve를 Completion(GetPromiseResolve(ctor))으로 둡니다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability).
  5. iteratorRecord를 Completion(GetIterator(iterable, sync))으로 둡니다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability).
  7. result를 Completion(PerformPromiseRace(iteratorRecord, ctor, promiseCapability, promiseResolve))으로 둡니다.
  8. result가 abrupt completion이면, 다음을 수행합니다.
    1. iteratorRecord.[[Done]]이 false이면 result를 Completion(IteratorClose(iteratorRecord, result))으로 설정합니다.
    2. IfAbruptRejectPromise(result, promiseCapability).
  9. ! result를 반환합니다.
참고 1

iterable 인수가 값을 산출하지 않거나 iterable이 산출한 promise 중 어느 것도 절대 settled되지 않으면 이 메서드가 반환한 pending promise도 절대 settled되지 않습니다.

참고 2

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수일 것으로 기대합니다. 또한 this 값이 resolve 메서드를 제공할 것으로 기대합니다.

27.5.4.5.1 PerformPromiseRace ( iteratorRecord, ctor, resultCapability, promiseResolve )

추상 연산 PerformPromiseRace. 인수 iteratorRecord (Iterator 레코드), ctor (생성자), resultCapability (PromiseCapability 레코드) 및 promiseResolve (함수 객체). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. 다음을 반복합니다.
    1. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
    2. next가 done이면, 다음을 수행합니다.
      1. resultCapability.[[Promise]]를 반환합니다.
    3. nextPromise를 ? Call(promiseResolve, ctor, « next »)로 둡니다.
    4. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] »)를 수행합니다.

27.5.4.6 Promise.reject ( reason )

이 함수는 전달된 인수로 rejected된 새로운 promise를 반환합니다.

  1. ctor를 this 값으로 둡니다.
  2. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  3. ? Call(promiseCapability.[[Reject]], undefined, « reason »)를 수행합니다.
  4. promiseCapability.[[Promise]]를 반환합니다.
참고

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수일 것으로 기대합니다.

27.5.4.7 Promise.resolve ( resolution )

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

  1. ctor를 this 값으로 둡니다.
  2. ctor가 Object가 아니면 TypeError 예외를 던집니다.
  3. ? PromiseResolve(ctor, resolution)을 반환합니다.
참고

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수일 것으로 기대합니다.

27.5.4.7.1 PromiseResolve ( ctor, resolution )

추상 연산 PromiseResolve. 인수 ctor (Object) 및 resolution (ECMAScript 언어 값). 반환값: (정상 완료 (값: Object) 또는 throw 완료). resolution으로 resolve된 새로운 promise를 반환합니다. 호출되면 다음 단계를 수행한다.

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

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. ctor를 this 값으로 둡니다.
  2. ctor가 Object가 아니면 TypeError 예외를 던집니다.
  3. status를 Completion(Call(callback, undefined, args))으로 둡니다.
  4. status가 abrupt completion이면, 다음을 수행합니다.
    1. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
    2. ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] »)를 수행합니다.
    3. promiseCapability.[[Promise]]를 반환합니다.
  5. 그렇지 않으면,
    1. ? PromiseResolve(ctor, ! status)를 반환합니다.
참고

이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수일 것으로 기대합니다.

27.5.4.9 Promise.withResolvers ( )

이 함수는 세 프로퍼티, 즉 새로운 promise와 그에 연결된 resolve 및 reject 함수를 갖는 객체를 반환합니다.

  1. ctor를 this 값으로 둡니다.
  2. promiseCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  3. obj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  4. ! CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]])를 수행합니다.
  5. ! CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]])를 수행합니다.
  6. ! CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]])를 수행합니다.
  7. obj를 반환합니다.

27.5.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%]는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

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

참고

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

27.5.5 Promise 프로토타입 객체의 프로퍼티

Promise 프로토타입 객체는:

  • %Promise.prototype%입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 일반 객체입니다.
  • [[PromiseState]] 내부 슬롯 또는 Promise 인스턴스의 다른 내부 슬롯을 갖지 않습니다.

27.5.5.1 Promise.prototype.catch ( onRejected )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. promise를 this 값으로 둡니다.
  2. ? Invoke(promise, "then", « undefined, onRejected »)를 반환합니다.

27.5.5.2 Promise.prototype.constructor

Promise.prototype.constructor의 초기 값은 %Promise%입니다.

27.5.5.3 Promise.prototype.finally ( onFinally )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. promise를 this 값으로 둡니다.
  2. promise가 Object가 아니면 TypeError 예외를 던집니다.
  3. ctor를 ? SpeciesConstructor(promise, %Promise%)로 둡니다.
  4. 단언: IsConstructor(ctor)는 true입니다.
  5. IsCallable(onFinally)가 false이면, 다음을 수행합니다.
    1. thenFinally를 onFinally로 둡니다.
    2. catchFinally를 onFinally로 둡니다.
  6. 그렇지 않으면,
    1. thenFinallyClosure를 매개변수 (value)를 가지며 onFinally와 ctor를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. result를 ? Call(onFinally, undefined)로 둡니다.
      2. p를 ? PromiseResolve(ctor, result)로 둡니다.
      3. returnValue를 매개변수가 없고 value를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
        1. NormalCompletion(value)을 반환합니다.
      4. valueThunk를 CreateBuiltinFunction(returnValue, 0, "", « »)로 둡니다.
      5. ? Invoke(p, "then", « valueThunk »)를 반환합니다.
    2. thenFinally를 CreateBuiltinFunction(thenFinallyClosure, 1, "", « »)로 둡니다.
    3. catchFinallyClosure를 매개변수 (reason)을 가지며 onFinally와 ctor를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
      1. result를 ? Call(onFinally, undefined)로 둡니다.
      2. p를 ? PromiseResolve(ctor, result)로 둡니다.
      3. throwReason을 매개변수가 없고 reason을 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
        1. reason을 던집니다.
      4. thrower를 CreateBuiltinFunction(throwReason, 0, "", « »)로 둡니다.
      5. ? Invoke(p, "then", « thrower »)를 반환합니다.
    4. catchFinally를 CreateBuiltinFunction(catchFinallyClosure, 1, "", « »)로 둡니다.
  7. ? Invoke(promise, "then", « thenFinally, catchFinally »)를 반환합니다.

27.5.5.4 Promise.prototype.then ( onFulfilled, onRejected )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. promise를 this 값으로 둡니다.
  2. IsPromise(promise)가 false이면 TypeError 예외를 던집니다.
  3. ctor를 ? SpeciesConstructor(promise, %Promise%)로 둡니다.
  4. resultCapability을 ? NewPromiseCapability(ctor)로 둡니다.
  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability)을 반환합니다.

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

추상 연산 PerformPromiseThen. 인수 promise (Promise), onFulfilled (ECMAScript 언어 값) 및 onRejected (ECMAScript 언어 값) 및 선택적 인수 resultCapability (PromiseCapability 레코드). 반환값: (Object 또는 undefined). onFulfilled와 onRejected를 settlement 동작으로 사용하여 promise에 “then” 연산을 수행합니다. resultCapability이 전달되면 resultCapability의 promise를 업데이트하여 결과를 저장합니다. 전달되지 않으면 결과가 중요하지 않은 명세 내부 연산에서 PerformPromiseThen이 호출된 것입니다. 호출되면 다음 단계를 수행한다.

  1. 단언: IsPromise(promise)는 true입니다.
  2. resultCapability이 존재하지 않으면, 다음을 수행합니다.
    1. resultCapability을 undefined로 설정합니다.
  3. IsCallable(onFulfilled)가 false이면, 다음을 수행합니다.
    1. onFulfilledJobCallback을 empty로 둡니다.
  4. 그렇지 않으면,
    1. onFulfilledJobCallback을 HostMakeJobCallback(onFulfilled)으로 둡니다.
  5. IsCallable(onRejected)가 false이면, 다음을 수행합니다.
    1. onRejectedJobCallback을 empty로 둡니다.
  6. 그렇지 않으면,
    1. onRejectedJobCallback을 HostMakeJobCallback(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. fulfillReaction을 promise.[[PromiseFulfillReactions]]에 추가합니다.
    2. rejectReaction을 promise.[[PromiseRejectReactions]]에 추가합니다.
  10. 그렇지 않고 promise.[[PromiseState]]가 fulfilled이면, 다음을 수행합니다.
    1. value를 promise.[[PromiseResult]]로 둡니다.
    2. fulfillJob을 NewPromiseReactionJob(fulfillReaction, value)로 둡니다.
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]])을 수행합니다.
  11. 그렇지 않으면,
    1. 단언: promise.[[PromiseState]]는 rejected입니다.
    2. reason을 promise.[[PromiseResult]]로 둡니다.
    3. promise.[[PromiseIsHandled]]가 false이면 HostPromiseRejectionTracker(promise, "handle")를 수행합니다.
    4. rejectJob을 NewPromiseReactionJob(rejectReaction, reason)으로 둡니다.
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]])을 수행합니다.
  12. promise.[[PromiseIsHandled]]를 true로 설정합니다.
  13. resultCapability이 undefined이면 undefined를 반환합니다.
  14. resultCapability.[[Promise]]를 반환합니다.

27.5.5.5 Promise.prototype [ %Symbol.toStringTag% ]

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.5.6 Promise 인스턴스의 프로퍼티

Promise 인스턴스는 Promise 프로토타입 객체(내재 %Promise.prototype%)에서 프로퍼티를 상속하는 일반 객체입니다. Promise 인스턴스는 처음에 표 93에 설명된 내부 슬롯과 함께 생성됩니다.

표 93: Promise 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[PromiseState]] pending, fulfilled, or rejected promise가 then 메서드에 대한 들어오는 호출에 어떻게 반응할지를 제어합니다.
[[PromiseResult]] an ECMAScript language value or empty promise가 fulfilled 또는 rejected된 값입니다. 값이 있을 경우에 해당합니다. [[PromiseState]]가 pending인 경우에만 empty입니다.
[[PromiseFulfillReactions]] a List of PromiseReaction Records promise가 pending 상태에서 fulfilled 상태로 전환될 때 처리할 Record입니다.
[[PromiseRejectReactions]] a List of PromiseReaction Records promise가 pending 상태에서 rejected 상태로 전환될 때 처리할 Record입니다.
[[PromiseIsHandled]] a Boolean promise에 fulfillment 또는 rejection handler가 한 번이라도 있었는지를 나타냅니다. 처리되지 않은 rejection 추적에 사용됩니다.

27.6 GeneratorFunction 객체

GeneratorFunction은 일반적으로 GeneratorDeclaration, GeneratorExpression, GeneratorMethod를 평가하여 생성되는 함수입니다. %GeneratorFunction% 내재 객체를 호출하여 생성할 수도 있습니다.

그림 6 (참고): Generator 객체 관계
매우 다양한 상자와 화살표.

27.6.1 GeneratorFunction 생성자

GeneratorFunction 생성자는:

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

27.6.1.1 GeneratorFunction ( ...paramArgs, bodyArg )

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. activeFunc를 활성 함수 객체로 둡니다.
  2. bodyArg가 존재하지 않으면 bodyArg를 빈 String으로 설정합니다.
  3. ? CreateDynamicFunction(activeFunc, NewTarget, generator, paramArgs, bodyArg)를 반환합니다.
참고

20.2.1.1의 참고를 참조하시기 바랍니다.

27.6.2 GeneratorFunction 생성자의 프로퍼티

GeneratorFunction 생성자는:

  • Function 생성자에서 상속하는 표준 내장 함수 객체입니다.
  • 값이 %Function%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 1𝔽인 "length" 프로퍼티를 갖습니다.
  • 값이 "GeneratorFunction"인 "name" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

27.6.2.1 GeneratorFunction.prototype

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.6.3 GeneratorFunction 프로토타입 객체의 프로퍼티

GeneratorFunction 프로토타입 객체는:

27.6.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor의 초기 값은 %GeneratorFunction%입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.6.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype의 초기 값은 %GeneratorPrototype%입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.6.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "GeneratorFunction"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.6.4 GeneratorFunction 인스턴스

모든 GeneratorFunction 인스턴스는 ECMAScript 함수 객체이며 표 26에 나열된 내부 슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false입니다.

각 GeneratorFunction 인스턴스에는 다음 자체 프로퍼티가 있습니다:

27.6.4.1 length

20.2.4.1에 제시된 Function 인스턴스의 "length" 프로퍼티 명세는 GeneratorFunction 인스턴스에도 적용됩니다.

27.6.4.2 name

20.2.4.2에 제시된 Function 인스턴스의 "name" 프로퍼티 명세는 GeneratorFunction 인스턴스에도 적용됩니다.

27.6.4.3 prototype

GeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체도 생성되며 generator 함수의 "prototype" 프로퍼티의 초기 값이 됩니다. prototype 프로퍼티 값은 generator 함수 객체가 [[Call]]을 사용하여 호출될 때 새로 생성되는 Generator의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.

이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

참고

Function 인스턴스와 달리 GeneratorFunction의 "prototype" 프로퍼티 값인 객체에는 값이 GeneratorFunction 인스턴스인 "constructor" 프로퍼티가 없습니다.

27.7 AsyncGeneratorFunction 객체

AsyncGeneratorFunction은 일반적으로 AsyncGeneratorDeclaration, AsyncGeneratorExpression, AsyncGeneratorMethod 구문 생성물을 평가하여 생성되는 함수입니다. %AsyncGeneratorFunction% 내재 객체를 호출하여 생성할 수도 있습니다.

27.7.1 AsyncGeneratorFunction 생성자

AsyncGeneratorFunction 생성자는:

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

27.7.1.1 AsyncGeneratorFunction ( ...paramArgs, bodyArg )

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. activeFunc를 활성 함수 객체로 둡니다.
  2. bodyArg가 존재하지 않으면 bodyArg를 빈 String으로 설정합니다.
  3. ? CreateDynamicFunction(activeFunc, NewTarget, async-generator, paramArgs, bodyArg)를 반환합니다.
참고

20.2.1.1의 참고를 참조하시기 바랍니다.

27.7.2 AsyncGeneratorFunction 생성자의 프로퍼티

AsyncGeneratorFunction 생성자는:

  • Function 생성자에서 상속하는 표준 내장 함수 객체입니다.
  • 값이 %Function%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 1𝔽인 "length" 프로퍼티를 갖습니다.
  • 값이 "AsyncGeneratorFunction"인 "name" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

27.7.2.1 AsyncGeneratorFunction.prototype

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.7.3 AsyncGeneratorFunction 프로토타입 객체의 프로퍼티

AsyncGeneratorFunction 프로토타입 객체는:

  • %AsyncGeneratorFunction.prototype%입니다.
  • 일반 객체입니다.
  • 함수 객체가 아니며 [[ECMAScriptCode]] 내부 슬롯이나 표 26 또는 표 95에 나열된 다른 내부 슬롯을 갖지 않습니다.
  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.

27.7.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor의 초기 값은 %AsyncGeneratorFunction%입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.7.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype의 초기 값은 %AsyncGeneratorPrototype%입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.7.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "AsyncGeneratorFunction"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.7.4 AsyncGeneratorFunction 인스턴스

모든 AsyncGeneratorFunction 인스턴스는 ECMAScript 함수 객체이며 표 26에 나열된 내부 슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false입니다.

각 AsyncGeneratorFunction 인스턴스에는 다음 자체 프로퍼티가 있습니다:

27.7.4.1 length

"length" 프로퍼티 값은 AsyncGeneratorFunction이 일반적으로 받을 것으로 예상되는 인수 수를 나타내는 정수 Number입니다. 그러나 언어는 다른 수의 인수로 함수를 호출하는 것도 허용합니다. "length" 프로퍼티에 지정된 수와 다른 수의 인수로 AsyncGeneratorFunction을 호출했을 때의 동작은 함수에 따라 달라집니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.7.4.2 name

20.2.4.2에 제시된 Function 인스턴스의 "name" 프로퍼티 명세는 AsyncGeneratorFunction 인스턴스에도 적용됩니다.

27.7.4.3 prototype

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

이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

참고

함수 인스턴스와 달리 AsyncGeneratorFunction의 "prototype" 프로퍼티 값인 객체에는 값이 AsyncGeneratorFunction 인스턴스인 "constructor" 프로퍼티가 없습니다.

27.8 Generator 객체

Generator는 generator 함수를 호출하여 생성되며 iterator 인터페이스와 iterable 인터페이스를 모두 준수합니다.

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

27.8.1 %GeneratorPrototype% 객체

%GeneratorPrototype% 객체는:

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

27.8.1.1 %GeneratorPrototype%.constructor

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.8.1.2 %GeneratorPrototype%.next ( value )

  1. ? GeneratorResume(this 값, value, empty)를 반환합니다.

27.8.1.3 %GeneratorPrototype%.return ( value )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. gen을 this 값으로 둡니다.
  2. completion을 ReturnCompletion(value)으로 둡니다.
  3. ? GeneratorResumeAbrupt(gen, completion, empty)를 반환합니다.

27.8.1.4 %GeneratorPrototype%.throw ( exception )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. gen을 this 값으로 둡니다.
  2. completion을 ThrowCompletion(exception)으로 둡니다.
  3. ? GeneratorResumeAbrupt(gen, completion, empty)를 반환합니다.

27.8.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.8.2 Generator 인스턴스의 프로퍼티

Generator 인스턴스는 처음에 표 94에 설명된 내부 슬롯과 함께 생성됩니다.

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

27.8.3 Generator 추상 연산

27.8.3.1 GeneratorStart ( gen, genBody )

추상 연산 GeneratorStart. 인수 gen (Generator) 및 genBody ((a FunctionBody Parse Node 또는 매개변수가 없는 추상 클로저)). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: gen.[[GeneratorState]]는 suspended-start입니다.
  2. genContext를 실행 중인 실행 컨텍스트로 둡니다.
  3. genContext의 Generator 구성 요소를 gen으로 설정합니다.
  4. closure를 매개변수가 없고 genBody를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. acGenContext를 실행 중인 실행 컨텍스트로 둡니다.
    2. acGen을 acGenContext의 Generator 구성 요소로 둡니다.
    3. genBody가 Parse Node이면, 다음을 수행합니다.
      1. result를 Completion(genBody의 Evaluation)으로 둡니다.
    4. 그렇지 않으면,
      1. 단언: genBody는 매개변수가 없는 Abstract Closure입니다.
      2. result를 Completion(genBody())로 둡니다.
    5. 단언: 여기서 반환한다면 generator는 예외를 던졌거나 암시적 또는 명시적 return을 수행했습니다.
    6. acGenContext를 실행 컨텍스트 스택에서 제거하고 실행 컨텍스트 스택 맨 위의 실행 컨텍스트를 실행 중인 실행 컨텍스트로 복원합니다.
    7. acGen.[[GeneratorState]]를 completed로 설정합니다.
    8. 참고: generator가 completed 상태에 들어가면 다시 벗어나지 않으며 연결된 실행 컨텍스트는 다시 재개되지 않습니다. acGen과 연결된 모든 실행 상태는 이 시점에 폐기할 수 있습니다.
    9. result가 throw completion이면, 다음을 수행합니다.
      1. resumption을 result로 둡니다.
    10. 그렇지 않으면,
      1. result가 normal completion이면, 다음을 수행합니다.
        1. resultValue를 undefined로 둡니다.
      2. 그렇지 않고 result가 return completion이면, 다음을 수행합니다.
        1. resultValue를 result.[[Value]]로 둡니다.
      3. resumption을 NormalCompletion(CreateIteratorResultObject(resultValue, true))으로 둡니다.
    11. callerContext를 실행 중인 실행 컨텍스트로 둡니다.
    12. resumption을 전달하여 callerContext를 재개합니다.
    13. 단언: 이 단계에는 절대 도달하지 않습니다.
  5. 해당 실행 컨텍스트의 평가가 재개될 때 closure가 인수 없이 호출되도록 genContext의 코드 평가 상태를 설정합니다.
  6. gen.[[GeneratorContext]]를 genContext로 설정합니다.
  7. unused를 반환합니다.

27.8.3.2 GeneratorValidate ( gen, genBrand )

추상 연산 GeneratorValidate. 인수 gen (ECMAScript 언어 값) 및 genBrand ((String 또는 empty)). 반환값: (정상 완료 (값: (suspended-start, suspended-yield 또는 completed)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ? RequireInternalSlot(gen, [[GeneratorState]])를 수행합니다.
  2. ? RequireInternalSlot(gen, [[GeneratorBrand]])를 수행합니다.
  3. gen.[[GeneratorBrand]]가 genBrand가 아니면 TypeError 예외를 던집니다.
  4. 단언: gen에는 [[GeneratorContext]] 내부 슬롯이 있습니다.
  5. state를 gen.[[GeneratorState]]로 둡니다.
  6. state가 executing이면 TypeError 예외를 던집니다.
  7. state를 반환합니다.

27.8.3.3 GeneratorResume ( gen, value, genBrand )

추상 연산 GeneratorResume. 인수 gen (ECMAScript 언어 값), value ((ECMAScript 언어 값 또는 empty)) 및 genBrand ((String 또는 empty)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. state를 ? GeneratorValidate(gen, genBrand)로 둡니다.
  2. state가 completed이면 CreateIteratorResultObject(undefined, true)를 반환합니다.
  3. 단언: state는 suspended-start 또는 suspended-yield입니다.
  4. genContext를 gen.[[GeneratorContext]]로 둡니다.
  5. gen.[[GeneratorState]]를 executing으로 설정합니다.
  6. ? RunSuspendedContext(genContext, NormalCompletion(value))을 반환합니다.

27.8.3.4 GeneratorResumeAbrupt ( gen, abruptCompletion, genBrand )

추상 연산 GeneratorResumeAbrupt. 인수 gen (ECMAScript 언어 값), abruptCompletion ((return 완료 또는 throw 완료)) 및 genBrand ((String 또는 empty)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. state를 ? GeneratorValidate(gen, genBrand)로 둡니다.
  2. state가 suspended-start이면, 다음을 수행합니다.
    1. gen.[[GeneratorState]]를 completed로 설정합니다.
    2. 참고: generator가 completed 상태에 들어가면 다시 벗어나지 않으며 연결된 실행 컨텍스트는 다시 재개되지 않습니다. gen과 연결된 모든 실행 상태는 이 시점에 폐기할 수 있습니다.
    3. state를 completed로 설정합니다.
  3. state가 completed이면, 다음을 수행합니다.
    1. abruptCompletion이 return completion이면, 다음을 수행합니다.
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true)를 반환합니다.
    2. ? abruptCompletion을 반환합니다.
  4. 단언: state는 suspended-yield입니다.
  5. genContext를 gen.[[GeneratorContext]]로 둡니다.
  6. gen.[[GeneratorState]]를 executing으로 설정합니다.
  7. ? RunSuspendedContext(genContext, abruptCompletion)을 반환합니다.

27.8.3.5 GetGeneratorKind ( )

추상 연산 GetGeneratorKind. 인수 없음. 반환값: (non-generator, sync 또는 async). 호출되면 다음 단계를 수행한다.

  1. genContext를 실행 중인 실행 컨텍스트로 둡니다.
  2. genContext에 Generator 구성 요소가 없으면 non-generator를 반환합니다.
  3. gen을 genContext의 Generator 구성 요소로 둡니다.
  4. gen에 [[AsyncGeneratorState]] 내부 슬롯이 있으면 async를 반환합니다.
  5. sync를 반환합니다.

27.8.3.6 GeneratorYield ( iteratorResult )

추상 연산 GeneratorYield. 인수 iteratorResult (an Object that conforms to the IteratorResult interface). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. genContext를 실행 중인 실행 컨텍스트로 둡니다.
  2. 단언: genContext는 generator의 실행 컨텍스트입니다.
  3. gen을 genContext의 Generator 구성 요소 값으로 둡니다.
  4. 단언: GetGeneratorKind()는 sync입니다.
  5. gen.[[GeneratorState]]를 suspended-yield로 설정합니다.
  6. ? RunCallerContext(iteratorResult)를 반환합니다.

27.8.3.7 Yield ( arg )

추상 연산 Yield. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. genKind를 GetGeneratorKind()로 둡니다.
  2. genKind가 async이면 ? AsyncGeneratorYield(? Await(arg))를 반환합니다.
  3. ? GeneratorYield(CreateIteratorResultObject(arg, false))를 반환합니다.

27.8.3.8 CreateIteratorFromClosure ( closure, genBrand, genProto [ , extraSlots ] )

추상 연산 CreateIteratorFromClosure. 인수 closure (매개변수가 없는 추상 클로저), genBrand ((String 또는 empty)) 및 genProto (Object) 및 선택적 인수 extraSlots (리스트 (요소: 내부 슬롯 이름)). 반환값: Generator. 호출되면 다음 단계를 수행한다.

  1. 참고: closure는 IteratorResult 객체를 산출하기 위한 Yield 연산 사용을 포함할 수 있습니다.
  2. extraSlots가 존재하지 않으면 extraSlots를 새로운 빈 List로 설정합니다.
  3. internalSlotsList를 extraSlots와 « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »의 목록 연결로 둡니다.
  4. gen을 OrdinaryObjectCreate(genProto, internalSlotsList)로 둡니다.
  5. gen.[[GeneratorBrand]]를 genBrand로 설정합니다.
  6. gen.[[GeneratorState]]를 suspended-start로 설정합니다.
  7. callerContext를 실행 중인 실행 컨텍스트로 둡니다.
  8. calleeContext를 새로운 실행 컨텍스트로 둡니다.
  9. calleeContext의 Function을 null로 설정합니다.
  10. calleeContext의 Realm을 현재 Realm Record로 설정합니다.
  11. calleeContext의 ScriptOrModule을 callerContext의 ScriptOrModule로 설정합니다.
  12. callerContext가 아직 일시 중단되지 않았다면 callerContext를 일시 중단합니다.
  13. calleeContext를 실행 컨텍스트 스택에 push합니다. 이제 calleeContext가 실행 중인 실행 컨텍스트입니다.
  14. GeneratorStart(gen, closure)를 수행합니다.
  15. calleeContext를 실행 컨텍스트 스택에서 제거하고 callerContext를 실행 중인 실행 컨텍스트로 복원합니다.
  16. gen을 반환합니다.

27.9 AsyncGenerator 객체

AsyncGenerator는 async generator 함수를 호출하여 생성되며 async iterator 인터페이스와 async iterable 인터페이스를 모두 준수합니다.

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

27.9.1 %AsyncGeneratorPrototype% 객체

%AsyncGeneratorPrototype% 객체는:

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

27.9.1.1 %AsyncGeneratorPrototype%.constructor

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.9.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. gen을 this 값으로 둡니다.
  2. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  3. result를 Completion(AsyncGeneratorValidate(gen, empty))으로 둡니다.
  4. IfAbruptRejectPromise(result, promiseCapability).
  5. state를 gen.[[AsyncGeneratorState]]로 둡니다.
  6. state가 completed이면, 다음을 수행합니다.
    1. iteratorResult를 CreateIteratorResultObject(undefined, true)로 둡니다.
    2. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행합니다.
    3. promiseCapability.[[Promise]]를 반환합니다.
  7. completion을 NormalCompletion(value)으로 둡니다.
  8. AsyncGeneratorEnqueue(gen, completion, promiseCapability)을 수행합니다.
  9. state가 suspended-start 또는 suspended-yield이면, 다음을 수행합니다.
    1. AsyncGeneratorResume(gen, completion)을 수행합니다.
  10. 그렇지 않으면,
    1. 단언: state는 executing 또는 draining-queue입니다.
  11. promiseCapability.[[Promise]]를 반환합니다.

27.9.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. gen을 this 값으로 둡니다.
  2. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  3. result를 Completion(AsyncGeneratorValidate(gen, empty))으로 둡니다.
  4. IfAbruptRejectPromise(result, promiseCapability).
  5. completion을 ReturnCompletion(value)으로 둡니다.
  6. AsyncGeneratorEnqueue(gen, completion, promiseCapability)을 수행합니다.
  7. state를 gen.[[AsyncGeneratorState]]로 둡니다.
  8. state가 suspended-start 또는 completed이면, 다음을 수행합니다.
    1. gen.[[AsyncGeneratorState]]를 draining-queue로 설정합니다.
    2. AsyncGeneratorAwaitReturn(gen)을 수행합니다.
  9. 그렇지 않고 state가 suspended-yield이면, 다음을 수행합니다.
    1. AsyncGeneratorResume(gen, completion)을 수행합니다.
  10. 그렇지 않으면,
    1. 단언: state는 executing 또는 draining-queue입니다.
  11. promiseCapability.[[Promise]]를 반환합니다.

27.9.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. gen을 this 값으로 둡니다.
  2. promiseCapability을 ! NewPromiseCapability(%Promise%)로 둡니다.
  3. result를 Completion(AsyncGeneratorValidate(gen, empty))으로 둡니다.
  4. IfAbruptRejectPromise(result, promiseCapability).
  5. state를 gen.[[AsyncGeneratorState]]로 둡니다.
  6. state가 suspended-start이면, 다음을 수행합니다.
    1. gen.[[AsyncGeneratorState]]를 completed로 설정합니다.
    2. state를 completed로 설정합니다.
  7. state가 completed이면, 다음을 수행합니다.
    1. ! Call(promiseCapability.[[Reject]], undefined, « exception »)를 수행합니다.
    2. promiseCapability.[[Promise]]를 반환합니다.
  8. completion을 ThrowCompletion(exception)으로 둡니다.
  9. AsyncGeneratorEnqueue(gen, completion, promiseCapability)을 수행합니다.
  10. state가 suspended-yield이면, 다음을 수행합니다.
    1. AsyncGeneratorResume(gen, completion)을 수행합니다.
  11. 그렇지 않으면,
    1. 단언: state는 executing 또는 draining-queue입니다.
  12. promiseCapability.[[Promise]]를 반환합니다.

27.9.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "AsyncGenerator"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.9.2 AsyncGenerator 인스턴스의 프로퍼티

AsyncGenerator 인스턴스는 처음에 아래에 설명된 내부 슬롯과 함께 생성됩니다:

표 95: AsyncGenerator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, or completed async generator의 현재 실행 상태입니다.
[[AsyncGeneratorContext]] an execution context 이 async generator의 코드를 실행할 때 사용하는 실행 컨텍스트입니다.
[[AsyncGeneratorQueue]] a List of AsyncGeneratorRequest Records async generator를 재개하라는 요청을 나타내는 Record입니다. 상태 전환 중을 제외하면 [[AsyncGeneratorState]]가 executing 또는 draining-queue인 경우에만 비어 있지 않습니다.
[[GeneratorBrand]] a String or empty 서로 다른 종류의 async generator를 구별하는 데 사용되는 브랜드입니다. ECMAScript 소스 텍스트로 선언된 async generator의 [[GeneratorBrand]]는 항상 empty입니다.

27.9.3 AsyncGenerator 추상 연산

27.9.3.1 AsyncGeneratorRequest Records

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

다음 필드를 갖습니다:

표 96: AsyncGeneratorRequest Record 필드
필드 이름 값 의미
[[Completion]] a Completion Record async generator를 재개하는 데 사용해야 하는 Completion Record입니다.
[[Capability]] a PromiseCapability Record 이 요청과 연결된 promise capability입니다.

27.9.3.2 AsyncGeneratorStart ( gen, genBody )

추상 연산 AsyncGeneratorStart. 인수 gen (AsyncGenerator) 및 genBody ((a FunctionBody Parse Node 또는 매개변수가 없는 추상 클로저)). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: gen.[[AsyncGeneratorState]]는 suspended-start입니다.
  2. genContext를 실행 중인 실행 컨텍스트로 둡니다.
  3. genContext의 Generator 구성 요소를 gen으로 설정합니다.
  4. closure를 매개변수가 없고 genBody를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. acGenContext를 실행 중인 실행 컨텍스트로 둡니다.
    2. acGen을 acGenContext의 Generator 구성 요소로 둡니다.
    3. genBody가 Parse Node이면, 다음을 수행합니다.
      1. result를 Completion(genBody의 Evaluation)으로 둡니다.
    4. 그렇지 않으면,
      1. 단언: genBody는 매개변수가 없는 Abstract Closure입니다.
      2. result를 Completion(genBody())로 둡니다.
    5. 단언: 여기서 반환한다면 async generator는 예외를 던졌거나 암시적 또는 명시적 return을 수행했습니다.
    6. acGenContext를 실행 컨텍스트 스택에서 제거하고 실행 컨텍스트 스택 맨 위의 실행 컨텍스트를 실행 중인 실행 컨텍스트로 복원합니다.
    7. acGen.[[AsyncGeneratorState]]를 draining-queue로 설정합니다.
    8. result가 normal completion이면 result를 NormalCompletion(undefined)으로 설정합니다.
    9. result가 return completion이면 result를 NormalCompletion(result.[[Value]])으로 설정합니다.
    10. AsyncGeneratorCompleteStep(acGen, result, true)를 수행합니다.
    11. AsyncGeneratorDrainQueue(acGen)를 수행합니다.
    12. callerContext를 실행 중인 실행 컨텍스트로 둡니다.
    13. NormalCompletion(undefined)을 전달하여 callerContext를 재개합니다.
    14. 단언: 이 단계에는 절대 도달하지 않습니다.
  5. 해당 실행 컨텍스트의 평가가 재개될 때 closure가 인수 없이 호출되도록 genContext의 코드 평가 상태를 설정합니다.
  6. gen.[[AsyncGeneratorContext]]를 genContext로 설정합니다.
  7. gen.[[AsyncGeneratorQueue]]를 새로운 빈 List로 설정합니다.
  8. unused를 반환합니다.

27.9.3.3 AsyncGeneratorValidate ( gen, genBrand )

추상 연산 AsyncGeneratorValidate. 인수 gen (ECMAScript 언어 값) 및 genBrand ((String 또는 empty)). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ? RequireInternalSlot(gen, [[AsyncGeneratorContext]])를 수행합니다.
  2. ? RequireInternalSlot(gen, [[AsyncGeneratorState]])를 수행합니다.
  3. ? RequireInternalSlot(gen, [[AsyncGeneratorQueue]])를 수행합니다.
  4. gen.[[GeneratorBrand]]가 genBrand가 아니면 TypeError 예외를 던집니다.
  5. unused를 반환합니다.

27.9.3.4 AsyncGeneratorEnqueue ( gen, completion, promiseCapability )

추상 연산 AsyncGeneratorEnqueue. 인수 gen (AsyncGenerator), completion (완료 레코드) 및 promiseCapability (PromiseCapability 레코드). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. request를 AsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability }로 둡니다.
  2. request를 gen.[[AsyncGeneratorQueue]]에 추가합니다.
  3. unused를 반환합니다.

27.9.3.5 AsyncGeneratorCompleteStep ( gen, completion, done [ , realm ] )

추상 연산 AsyncGeneratorCompleteStep. 인수 gen (AsyncGenerator), completion (완료 레코드) 및 done (Boolean) 및 선택적 인수 realm (Realm 레코드). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: gen.[[AsyncGeneratorQueue]]는 비어 있지 않습니다.
  2. next를 gen.[[AsyncGeneratorQueue]]의 첫 번째 요소로 둡니다.
  3. gen.[[AsyncGeneratorQueue]]에서 첫 번째 요소를 제거합니다.
  4. promiseCapability을 next.[[Capability]]로 둡니다.
  5. value를 completion.[[Value]]로 둡니다.
  6. completion이 throw completion이면, 다음을 수행합니다.
    1. ! Call(promiseCapability.[[Reject]], undefined, « value »)를 수행합니다.
  7. 그렇지 않으면,
    1. 단언: completion은 normal completion입니다.
    2. realm이 존재하면, 다음을 수행합니다.
      1. oldRealm을 실행 중인 실행 컨텍스트의 Realm으로 둡니다.
      2. 실행 중인 실행 컨텍스트의 Realm을 realm으로 설정합니다.
      3. iteratorResult를 CreateIteratorResultObject(value, done)로 둡니다.
      4. 실행 중인 실행 컨텍스트의 Realm을 oldRealm으로 설정합니다.
    3. 그렇지 않으면,
      1. iteratorResult를 CreateIteratorResultObject(value, done)로 둡니다.
    4. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행합니다.
  8. unused를 반환합니다.

27.9.3.6 AsyncGeneratorResume ( gen, completion )

추상 연산 AsyncGeneratorResume. 인수 gen (AsyncGenerator) 및 completion (완료 레코드). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: gen.[[AsyncGeneratorState]]는 suspended-start 또는 suspended-yield입니다.
  2. genContext를 gen.[[AsyncGeneratorContext]]로 둡니다.
  3. gen.[[AsyncGeneratorState]]를 executing으로 설정합니다.
  4. ! RunSuspendedContext(genContext, completion)을 수행합니다.
  5. unused를 반환합니다.

27.9.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

추상 연산 AsyncGeneratorUnwrapYieldResumption. 인수 resumptionValue (완료 레코드). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. resumptionValue가 return completion이 아니면 ? resumptionValue를 반환합니다.
  2. awaited를 Completion(Await(resumptionValue.[[Value]]))으로 둡니다.
  3. awaited가 throw completion이면 ? awaited를 반환합니다.
  4. 단언: awaited는 normal completion입니다.
  5. ReturnCompletion(awaited.[[Value]])을 반환합니다.

27.9.3.8 AsyncGeneratorYield ( arg )

추상 연산 AsyncGeneratorYield. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. genContext를 실행 중인 실행 컨텍스트로 둡니다.
  2. 단언: genContext는 generator의 실행 컨텍스트입니다.
  3. gen을 genContext의 Generator 구성 요소 값으로 둡니다.
  4. 단언: GetGeneratorKind()는 async입니다.
  5. completion을 NormalCompletion(arg)으로 둡니다.
  6. 단언: 실행 컨텍스트 스택에는 최소 두 개의 요소가 있습니다.
  7. previousContext를 실행 컨텍스트 스택에서 위에서 두 번째 요소로 둡니다.
  8. previousRealm을 previousContext의 Realm으로 둡니다.
  9. AsyncGeneratorCompleteStep(gen, completion, false, previousRealm)을 수행합니다.
  10. queue를 gen.[[AsyncGeneratorQueue]]로 둡니다.
  11. queue가 비어 있지 않으면, 다음을 수행합니다.
    1. 참고: generator를 일시 중단하지 않고 실행이 계속됩니다.
    2. toYield를 queue의 첫 번째 요소로 둡니다.
    3. resumptionValue를 Completion(toYield.[[Completion]])으로 둡니다.
    4. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)을 반환합니다.
  12. gen.[[AsyncGeneratorState]]를 suspended-yield로 설정합니다.
  13. resumptionValue를 Completion(RunCallerContext(undefined))으로 둡니다.
  14. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)을 반환합니다.

27.9.3.9 AsyncGeneratorAwaitReturn ( gen )

추상 연산 AsyncGeneratorAwaitReturn. 인수 gen (AsyncGenerator). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. 단언: gen.[[AsyncGeneratorState]]는 draining-queue입니다.
  2. queue를 gen.[[AsyncGeneratorQueue]]로 둡니다.
  3. 단언: queue는 비어 있지 않습니다.
  4. next를 queue의 첫 번째 요소로 둡니다.
  5. completion을 Completion(next.[[Completion]])으로 둡니다.
  6. 단언: completion은 return completion입니다.
  7. promiseCompletion을 Completion(PromiseResolve(%Promise%, completion.[[Value]]))으로 둡니다.
  8. promiseCompletion이 abrupt completion이면, 다음을 수행합니다.
    1. AsyncGeneratorCompleteStep(gen, promiseCompletion, true)를 수행합니다.
    2. AsyncGeneratorDrainQueue(gen)를 수행합니다.
    3. unused를 반환합니다.
  9. 단언: promiseCompletion은 normal completion입니다.
  10. promise를 promiseCompletion.[[Value]]로 둡니다.
  11. fulfilledClosure를 매개변수 (value)를 가지며 gen을 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. 단언: gen.[[AsyncGeneratorState]]는 draining-queue입니다.
    2. result를 NormalCompletion(value)으로 둡니다.
    3. AsyncGeneratorCompleteStep(gen, result, true)를 수행합니다.
    4. AsyncGeneratorDrainQueue(gen)를 수행합니다.
    5. NormalCompletion(undefined)을 반환합니다.
  12. onFulfilled를 CreateBuiltinFunction(fulfilledClosure, 1, "", « »)로 둡니다.
  13. rejectedClosure를 매개변수 (reason)을 가지며 gen을 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. 단언: gen.[[AsyncGeneratorState]]는 draining-queue입니다.
    2. result를 ThrowCompletion(reason)으로 둡니다.
    3. AsyncGeneratorCompleteStep(gen, result, true)를 수행합니다.
    4. AsyncGeneratorDrainQueue(gen)를 수행합니다.
    5. NormalCompletion(undefined)을 반환합니다.
  14. onRejected를 CreateBuiltinFunction(rejectedClosure, 1, "", « »)로 둡니다.
  15. PerformPromiseThen(promise, onFulfilled, onRejected)을 수행합니다.
  16. unused를 반환합니다.

27.9.3.10 AsyncGeneratorDrainQueue ( gen )

추상 연산 AsyncGeneratorDrainQueue. 인수 gen (AsyncGenerator). 반환값: unused. return completion을 보유하는 AsyncGeneratorRequest를 만날 때까지 generator의 AsyncGeneratorQueue를 비웁니다. 호출되면 다음 단계를 수행한다.

  1. 단언: gen.[[AsyncGeneratorState]]는 draining-queue입니다.
  2. queue를 gen.[[AsyncGeneratorQueue]]로 둡니다.
  3. queue가 비어 있지 않은 동안 다음을 반복합니다.
    1. next를 queue의 첫 번째 요소로 둡니다.
    2. completion을 Completion(next.[[Completion]])으로 둡니다.
    3. completion이 return completion이면, 다음을 수행합니다.
      1. AsyncGeneratorAwaitReturn(gen)을 수행합니다.
      2. unused를 반환합니다.
    4. completion이 normal completion이면, 다음을 수행합니다.
      1. completion을 NormalCompletion(undefined)으로 설정합니다.
    5. AsyncGeneratorCompleteStep(gen, completion, true)를 수행합니다.
  4. gen.[[AsyncGeneratorState]]를 completed로 설정합니다.
  5. unused를 반환합니다.

27.10 AsyncFunction 객체

AsyncFunction은 일반적으로 AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncMethod, AsyncArrowFunction을 평가하여 생성되는 함수입니다. %AsyncFunction% 내재 객체를 호출하여 생성할 수도 있습니다.

27.10.1 AsyncFunction 생성자

AsyncFunction 생성자는:

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

27.10.1.1 AsyncFunction ( ...paramArgs, bodyArg )

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. activeFunc를 활성 함수 객체로 둡니다.
  2. bodyArg가 존재하지 않으면 bodyArg를 빈 String으로 설정합니다.
  3. ? CreateDynamicFunction(activeFunc, NewTarget, async, paramArgs, bodyArg)를 반환합니다.
참고
20.2.1.1의 참고를 참조하시기 바랍니다.

27.10.2 AsyncFunction 생성자의 프로퍼티

AsyncFunction 생성자는:

  • Function 생성자에서 상속하는 표준 내장 함수 객체입니다.
  • 값이 %Function%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 1𝔽인 "length" 프로퍼티를 갖습니다.
  • 값이 "AsyncFunction"인 "name" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

27.10.2.1 AsyncFunction.prototype

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

27.10.3 AsyncFunction 프로토타입 객체의 프로퍼티

AsyncFunction 프로토타입 객체는:

  • %AsyncFunction.prototype%입니다.
  • 일반 객체입니다.
  • 함수 객체가 아니며 [[ECMAScriptCode]] 내부 슬롯이나 표 26에 나열된 다른 내부 슬롯을 갖지 않습니다.
  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.

27.10.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor의 초기 값은 %AsyncFunction%입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.10.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "AsyncFunction"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

27.10.4 AsyncFunction 인스턴스

모든 AsyncFunction 인스턴스는 ECMAScript 함수 객체이며 표 26에 나열된 내부 슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false입니다. AsyncFunction 인스턴스는 생성자가 아니며 [[Construct]] 내부 메서드를 갖지 않습니다. AsyncFunction 인스턴스는 생성할 수 없으므로 prototype 프로퍼티를 갖지 않습니다.

각 AsyncFunction 인스턴스에는 다음 자체 프로퍼티가 있습니다:

27.10.4.1 length

20.2.4.1에 제시된 Function 인스턴스의 "length" 프로퍼티 명세는 AsyncFunction 인스턴스에도 적용됩니다.

27.10.4.2 name

20.2.4.2에 제시된 Function 인스턴스의 "name" 프로퍼티 명세는 AsyncFunction 인스턴스에도 적용됩니다.

27.10.5 Async 함수 추상 연산

27.10.5.1 AsyncFunctionStart ( promiseCapability, asyncFuncBody )

추상 연산 AsyncFunctionStart. 인수 promiseCapability (PromiseCapability 레코드) 및 asyncFuncBody ((a FunctionBody Parse Node, an ExpressionBody Parse Node 또는 매개변수가 없는 추상 클로저)). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. runningContext를 실행 중인 실행 컨텍스트로 둡니다.
  2. asyncContext를 runningContext의 복사본으로 둡니다.
  3. 참고: AsyncBlockStart가 실행을 재개하려면 실행 상태를 복사해야 합니다. 현재 실행 중인 컨텍스트를 재개하는 것은 정의되지 않습니다.
  4. AsyncBlockStart(promiseCapability, asyncFuncBody, asyncContext)를 수행합니다.
  5. unused를 반환합니다.

27.10.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

추상 연산 AsyncBlockStart. 인수 promiseCapability (PromiseCapability 레코드), asyncBody ((구문 분석 노드 또는 매개변수가 없는 추상 클로저)) 및 asyncContext (실행 컨텍스트). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. closure를 매개변수가 없고 promiseCapability과 asyncBody를 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. acAsyncContext를 실행 중인 실행 컨텍스트로 둡니다.
    2. asyncBody가 Parse Node이면, 다음을 수행합니다.
      1. result를 Completion(asyncBody의 Evaluation)으로 둡니다.
    3. 그렇지 않으면,
      1. 단언: asyncBody는 매개변수가 없는 Abstract Closure입니다.
      2. result를 Completion(asyncBody())로 둡니다.
    4. 단언: 여기서 반환한다면 async 함수는 예외를 던졌거나 암시적 또는 명시적 return을 수행했으며 모든 await가 완료되었습니다.
    5. acAsyncContext를 실행 컨텍스트 스택에서 제거하고 실행 컨텍스트 스택 맨 위의 실행 컨텍스트를 실행 중인 실행 컨텍스트로 복원합니다.
    6. result가 normal completion이면, 다음을 수행합니다.
      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined »)를 수행합니다.
    7. 그렇지 않고 result가 return completion이면, 다음을 수행합니다.
      1. ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] »)를 수행합니다.
    8. 그렇지 않으면,
      1. 단언: result는 throw completion입니다.
      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »)를 수행합니다.
    9. callerContext를 실행 중인 실행 컨텍스트로 둡니다.
    10. NormalCompletion(unused)을 전달하여 callerContext를 재개합니다.
    11. 단언: 이 단계에는 절대 도달하지 않습니다.
  2. 해당 실행 컨텍스트의 평가가 재개될 때 closure가 인수 없이 호출되도록 asyncContext의 코드 평가 상태를 설정합니다.
  3. result를 ! RunSuspendedContext(asyncContext, NormalCompletion(empty))로 둡니다.
  4. 단언: result는 unused입니다.
  5. 참고: result 값의 가능한 출처는 Await 또는 async 함수가 아무것도 await하지 않는 경우 위의 1.j 단계입니다.
  6. unused를 반환합니다.

27.10.5.3 Await ( arg )

추상 연산 Await. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: (ECMAScript 언어 값 또는 empty)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. asyncContext를 실행 중인 실행 컨텍스트로 둡니다.
  2. promise를 ? PromiseResolve(%Promise%, arg)로 둡니다.
  3. fulfilledClosure를 매개변수 (value)를 가지며 asyncContext를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. Completion(RunSuspendedContext(asyncContext, NormalCompletion(value)))을 수행합니다.
    2. 참고: RunSuspendedContext가 반환하는 Completion Record는 의도적으로 무시됩니다.
    3. NormalCompletion(undefined)을 반환합니다.
  4. onFulfilled를 CreateBuiltinFunction(fulfilledClosure, 1, "", « »)로 둡니다.
  5. rejectedClosure를 매개변수 (reason)을 가지며 asyncContext를 캡처하고 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason)))을 수행합니다.
    2. 참고: RunSuspendedContext가 반환하는 Completion Record는 의도적으로 무시됩니다.
    3. NormalCompletion(undefined)을 반환합니다.
  6. onRejected를 CreateBuiltinFunction(rejectedClosure, 1, "", « »)로 둡니다.
  7. PerformPromiseThen(promise, onFulfilled, onRejected)을 수행합니다.
  8. ? RunCallerContext(empty)를 반환합니다.