← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
27

Kontrol Soyutlama Nesneleri (Control Abstraction Objects)

27.1 Yineleme (Iteration)

27.1.1 Ortak Yineleme Arayüzleri (Common Iteration Interfaces)

Bir arayüz (interface), ilişkili değerleri belirli bir belirtimle eşleşen bir özellik anahtarları (property keys) kümesidir. Bir arayüzün belirtiminde açıklandığı gibi tüm özellikleri sağlayan herhangi bir nesne o arayüze uyum sağlar. Bir arayüz, ayrı bir nesne ile temsil edilmez. Herhangi bir arayüze uyum sağlayan, ayrı ayrı gerçekleştirilmiş birçok nesne olabilir. Bireysel bir nesne birden fazla arayüze uyum sağlayabilir.

27.1.1.1 Yinelenebilir Arayüzü (The Iterable Interface)

Yinelenebilir (iterable) arayüzü, Tablo 78 içinde açıklanan özellikleri içerir:

Tablo 78: Yinelenebilir (Iterable) Arayüzü Gerekli Özellikleri

Özellik Değer Gereksinimler
%Symbol.iterator% bir yineleyici nesne (iterator object) döndüren bir fonksiyon Döndürülen nesne yineleyici arayüzüne (iterator interface) uyum sağlamalıdır.

27.1.1.2 Yineleyici Arayüzü (The Iterator Interface)

Yineleyici arayüzünü uygulayan bir nesne, Tablo 79 içindeki özelliği içermelidir. Bu tür nesneler Tablo 80 içindeki özellikleri de uygulayabilir.

Tablo 79: Yineleyici (Iterator) Arayüzü Gerekli Özellikleri

Özellik Değer Gereksinimler
"next" bir IteratorResult nesnesi döndüren bir fonksiyon Döndürülen nesne IteratorResult arayüzüne uyum sağlamalıdır. Eğer bir yineleyicinin (iterator) next metoduna yapılan önceki bir çağrı, "done" özelliği true olan bir IteratorResult nesnesi döndürmüşse, o nesnenin next metoduna yapılan sonraki tüm çağrılar da "done" özelliği true olan bir IteratorResult nesnesi döndürmelidir. Ancak, bu gereksinim zorunlu kılınmamıştır.

Tablo 80: Yineleyici (Iterator) Arayüzü İsteğe Bağlı Özellikleri

Özellik Değer Gereksinimler
"return" bir IteratorResult nesnesi döndüren bir fonksiyon Döndürülen nesne IteratorResult arayüzüne uyum sağlamalıdır. Bu metodun çağrılması, yineleyici nesneye (iterator object) çağıranın artık yineleyici (iterator) üzerinde next metodu çağrıları yapma niyetinde olmadığını bildirir. Döndürülen IteratorResult nesnesi genellikle değeri true olan bir "done" özelliğine ve return metodunun argümanı olarak aktarılan değere sahip bir "value" özelliğine sahip olacaktır. Ancak, bu gereksinim zorunlu kılınmamıştır.
"throw" bir IteratorResult nesnesi döndüren bir fonksiyon Döndürülen nesne IteratorResult arayüzüne uyum sağlamalıdır. Bu metodun çağrılması, yineleyici nesneye (iterator object) çağıranın bir hata durumu tespit ettiğini bildirir. Argüman, hata durumunu tanımlamak için kullanılabilir ve genellikle bir istisna nesnesi olacaktır. Tipik bir yanıt, argüman olarak aktarılan değeri fırlatmaktır (throw). Eğer metot fırlatmazsa (throw), döndürülen IteratorResult nesnesi genellikle değeri true olan bir "done" özelliğine sahip olacaktır.

27.1.1.3 Asenkron Yinelenebilir Arayüzü (The Async Iterable Interface)

Asenkron yinelenebilir (async iterable) arayüzü, Tablo 81 içinde açıklanan özellikleri içerir:

Tablo 81: Asenkron Yinelenebilir (Iterable) Arayüzü Gerekli Özellikleri

Özellik Değer Gereksinimler
%Symbol.asyncIterator% bir asenkron yineleyici nesne (async iterator object) döndüren bir fonksiyon Döndürülen nesne asenkron yineleyici arayüzüne (async iterator interface) uyum sağlamalıdır.

27.1.1.4 Asenkron Yineleyici Arayüzü (The Async Iterator Interface)

Asenkron yineleyici arayüzünü uygulayan bir nesne, Tablo 82 içindeki özellikleri içermelidir. Bu tür nesneler Tablo 83 içindeki özellikleri de uygulayabilir.

Tablo 82: Asenkron Yineleyici (Iterator) Arayüzü Gerekli Özellikleri

Özellik Değer Gereksinimler
"next" bir IteratorResult nesnesi için bir promise döndüren bir fonksiyon Döndürülen promise, yerine getirildiğinde (fulfilled), IteratorResult arayüzüne uyum sağlayan bir nesneyle sonuçlanmalıdır. Eğer bir asenkron yineleyicinin (async iterator) next metoduna yapılan önceki bir çağrı, "done" özelliği true olan bir IteratorResult nesnesi için promise döndürmüşse, o nesnenin next metoduna yapılan sonraki tüm çağrılar da "done" özelliği true olan bir IteratorResult nesnesi için promise döndürmelidir. Ancak, bu gereksinim zorunlu kılınmamıştır. Ayrıca, yerine getirme değeri (fulfillment value) olarak hizmet eden IteratorResult nesnesi, değeri bir promise (veya "thenable") olmayan bir "value" özelliğine sahip olmalıdır. Ancak, bu gereksinim de zorunlu kılınmamıştır.

Tablo 83: Asenkron Yineleyici (Iterator) Arayüzü İsteğe Bağlı Özellikleri

Özellik Değer Gereksinimler
"return" bir IteratorResult nesnesi için bir promise döndüren bir fonksiyon Döndürülen promise, yerine getirildiğinde (fulfilled), IteratorResult arayüzüne uyum sağlayan bir nesneyle sonuçlanmalıdır. Bu metodun çağrılması, asenkron yineleyici nesneye (async iterator object) çağıranın artık asenkron yineleyici (async iterator) üzerinde next metodu çağrıları yapma niyetinde olmadığını bildirir. Döndürülen promise, genellikle değeri true olan bir "done" özelliğine ve return metodunun argümanı olarak aktarılan değere sahip bir "value" özelliğine sahip olacak bir IteratorResult nesnesiyle yerine getirilecektir (fulfill). Ancak, bu gereksinim zorunlu kılınmamıştır. Ayrıca, yerine getirme değeri (fulfillment value) olarak hizmet eden IteratorResult nesnesi, değeri bir promise (veya "thenable") olmayan bir "value" özelliğine sahip olmalıdır. Eğer argüman değeri yaygın şekilde kullanılıyorsa, bu durumda eğer o reddedilmiş (rejected) bir promise ise, aynı gerekçeyle reddedilen bir promise döndürülmelidir; eğer yerine getirilmiş (fulfilled) bir promise ise, onun yerine getirme değeri, döndürülen promise'in IteratorResult nesnesi yerine getirme değerinin "value" özelliği olarak kullanılmalıdır. Ancak, bu gereksinimler de zorunlu kılınmamıştır.
"throw" bir IteratorResult nesnesi için bir promise döndüren bir fonksiyon Döndürülen promise, yerine getirildiğinde (fulfilled), IteratorResult arayüzüne uyum sağlayan bir nesneyle sonuçlanmalıdır. Bu metodun çağrılması, asenkron yineleyici nesneye (async iterator object) çağıranın bir hata durumu tespit ettiğini bildirir. Argüman, hata durumunu tanımlamak için kullanılabilir ve genellikle bir istisna nesnesi olacaktır. Tipik bir yanıt, argüman olarak aktarılan değerle reddedilen (rejected) bir promise döndürmektir. Eğer döndürülen promise yerine getirilirse (fulfilled), IteratorResult nesnesi yerine getirme değeri genellikle değeri true olan bir "done" özelliğine sahip olacaktır. Ayrıca, değeri promise (veya "thenable") olmayan bir "value" özelliğine sahip olmalıdır, ancak bu gereksinim zorunlu kılınmamıştır.

27.1.1.5 IteratorResult Arayüzü (The IteratorResult Interface)

IteratorResult arayüzü, Tablo 84 içinde listelenen özellikleri içerir:

Tablo 84: IteratorResult Arayüzü Özellikleri

Özellik Değer Gereksinimler
"done" bir Boolean Bu özellik, bir yineleyici (iterator) next metot çağrısının sonuç durumudur. Eğer yineleyicinin (iterator) sonuna ulaşıldıysa "done" değeri true olur. Sonuna ulaşılmadıysa "done" değeri false olur ve bir değer mevcuttur. Eğer bir "done" özelliği (kendi özelliği veya miras alınan) mevcut değilse, false değerine sahip olduğu kabul edilir.
"value" bir ECMAScript dil değeri (ECMAScript language value) Eğer done değeri false ise, bu geçerli yineleme elemanı değeridir. Eğer done değeri true ise, yineleyici bir dönüş değeri sağladıysa bu yineleyicinin (iterator) dönüş değeridir. Eğer yineleyicinin bir dönüş değeri yoksa "value" özelliği undefined olur. Bu durumda, uyum sağlayan nesne açık bir "value" özelliğini miras almıyorsa, "value" özelliği o nesnede bulunmayabilir.

27.1.2 Yineleyici Yardımcı Nesneleri (Iterator Helper Objects)

Bir Yineleyici Yardımcı (Iterator Helper) nesnesi, belirli bir kaynak yineleyici nesnenin (iterator object) tembel bir dönüşümünü (lazy transformation) temsil eden bir sıradan nesnedir (ordinary object). Yineleyici Yardımcı nesneleri için adlandırılmış bir yapıcı (constructor) bulunmamaktadır. Bunun yerine Yineleyici Yardımcı nesneleri, Iterator örnek nesnelerinin belirli metotları çağrılarak oluşturulur.

27.1.2.1 %IteratorHelperPrototype% Nesnesi (The %IteratorHelperPrototype% Object)

%IteratorHelperPrototype% nesnesi:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )
  1. ? GeneratorResume(this değeri, undefined, "Iterator Helper") döndür.
27.1.2.1.2 %IteratorHelperPrototype%.return ( )
  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[UnderlyingIterators]]) işlemini gerçekleştir.

  3. Assert: obj nesnesinin bir [[GeneratorState]] dahili yuvası vardır.

  4. Eğer obj.[[GeneratorState]] değeri suspended-start ise, o zaman

    1. obj.[[GeneratorState]] değerini completed olarak ayarla.

    2. NOTE: Bir üreteç (generator) tamamlanmış (completed) duruma girdiğinde bu durumdan asla çıkmaz ve ilişkili yürütme bağlamı (execution context) bir daha asla sürdürülmez. obj ile ilişkili herhangi bir yürütme durumu bu noktada atılabilir.

    3. ? IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused)) işlemini gerçekleştir.

    4. CreateIteratorResultObject(undefined, true) döndür.

  5. completion, ReturnCompletion(undefined) olsun.

  6. ? GeneratorResumeAbrupt(obj, completion, "Iterator Helper") döndür.

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag%(07_sec-ecmascript-data-types-and-values.md#sec-well-known-symbols) özelliğinin ilk değeri "Iterator Helper" dizgisidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.1.3 Yineleyici Nesneleri (Iterator Objects)

27.1.3.1 Iterator Yapıcısı (The Iterator Constructor)

Iterator yapıcısı (constructor):

  • %Iterator% nesnesidir.

  • global nesnenin (global object) "Iterator" özelliğinin ilk değeridir.

  • alt sınıf oluşturulabilecek (subclassable) şekilde tasarlanmıştır. Bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir.

27.1.3.1.1 Iterator ( )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer NewTarget; undefined veya etkin fonksiyon nesnesi (active function object) ise, bir TypeError istisnası fırlat.

  2. ? OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%") döndür.

27.1.3.2 Iterator Yapıcısının Özellikleri (Properties of the Iterator Constructor)

Iterator yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

27.1.3.2.1 Iterator.concat ( ...items )
  1. iterables, yeni ve boş bir Liste (List) olsun.

  2. items listesindeki her bir item elemanı için sırayla yap:

    1. Eğer item bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

    2. method, ? GetMethod(item, %Symbol.iterator%) olsun.

    3. Eğer method undefined ise, bir TypeError istisnası fırlat.

    4. { [[OpenMethod]]: method, [[Iterable]]: item } Kaydını (Record) iterables listesine ekle.

  3. closure, hiçbir parametre almayan, iterables listesini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. iterables listesindeki her bir iterable Kaydı (Record) for each element of iterables, sırayla yap:

      1. iterator, ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]]) olsun.

      2. Eğer iterator bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

      3. iteratorRecord, ? GetIteratorDirect(iterator) olsun.

      4. innerAlive, true olsun.

      5. innerAlive true olduğu sürece tekrarla:

         1. *innerValue*, ? [IteratorStepValue](08_sec-abstract-operations.md#sec-iteratorstepvalue)(*iteratorRecord*) olsun.
        
         2. Eğer *innerValue* `done` ise, o zaman
        
                   1. *innerAlive* değerini `false` olarak ayarla.
        
         3. Değilse,
        
                   1. *completion*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([Yield](#sec-yield)(*innerValue*)) olsun.
        
                   2. Eğer *completion* bir [ani tamamlanma (abrupt completion)](07_sec-ecmascript-data-types-and-values.md#sec-completion-record-specification-type) ise, o zaman
        
                             1. ? [IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*iteratorRecord*, *completion*) döndür.
    2. ReturnCompletion(undefined) döndür.

  4. gen, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  5. gen.[[UnderlyingIterators]] değerini yeni ve boş bir Liste (List) olarak ayarla.

  6. gen döndür.

27.1.3.2.2 Iterator.from ( obj )
  1. iteratorRecord, ? GetIteratorFlattenable(obj, iterate-string-primitives) olsun.

  2. hasInstance, ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]) olsun.

  3. Eğer hasInstance true ise, o zaman

    1. iteratorRecord.[[Iterator]] döndür.
  4. wrapper, OrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] ») olsun.

  5. wrapper.[[Iterated]] değerini iteratorRecord olarak ayarla.

  6. wrapper döndür.

27.1.3.2.2.1 %WrapForValidIteratorPrototype% Nesnesi (The %WrapForValidIteratorPrototype% Object)

%WrapForValidIteratorPrototype% nesnesi:

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )
  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[Iterated]]) işlemini gerçekleştir.

  3. iteratorRecord, obj.[[Iterated]] olsun.

  4. ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) döndür.

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )
  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[Iterated]]) işlemini gerçekleştir.

  3. iterator, obj.[[Iterated]].[[Iterator]] olsun.

  4. Assert: iterator bir Nesnedir (is an Object).

  5. returnMethod, ? GetMethod(iterator, "return") olsun.

  6. Eğer returnMethod undefined ise, o zaman

    1. CreateIteratorResultObject(undefined, true) döndür.
  7. ? Call(returnMethod, iterator) döndür.

27.1.3.2.3 Iterator.prototype

Iterator.prototype özelliğinin ilk değeri Iterator prototip nesnesidir (Iterator prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.1.3.2.4 Iterator.zip ( iterables [ , options ] )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer iterables bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  2. options nesnesini ? GetOptionsObject(options) olarak ayarla.

  3. mode, ? Get(options, "mode") olsun.

  4. Eğer mode undefined ise, mode değerini "shortest" olarak ayarla.

  5. Eğer mode; "shortest", "longest" veya "strict" değerlerinden biri değilse, bir TypeError istisnası fırlat.

  6. paddingOption, undefined olsun.

  7. Eğer mode "longest" ise, o zaman

    1. paddingOption değerini ? Get(options, "padding") olarak ayarla.

    2. Eğer paddingOption undefined değilse ve paddingOption bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  8. iters, yeni ve boş bir Liste (List) olsun.

  9. padding, yeni ve boş bir Liste (List) olsun.

  10. inputIter, ? GetIterator(iterables, sync) olsun.

  11. next, "not-started" olsun.

  12. next değeri "done" olmadığı sürece tekrarla:

    1. next değerini Completion(IteratorStepValue(inputIter)) olarak ayarla.

    2. IfAbruptCloseIterators(next, iters) işlemini gerçekleştir.

    3. Eğer next "done" değilse, o zaman

      1. iter, Completion(GetIteratorFlattenable(next, reject-primitives)) olsun.

      2. needClosing, « inputIter » ve iters listelerinin liste birleşimi (list-concatenation) olsun.

      3. IfAbruptCloseIterators(iter, needClosing) işlemini gerçekleştir.

      4. iter değerini iters listesinin sonuna ekle.

  13. iterCount, iters listesindeki eleman sayısı olsun.

  14. Eğer mode "longest" ise, o zaman

    1. Eğer paddingOption undefined ise, o zaman

      1. iterCount kez tekrarla:

         1. *padding* listesine `undefined` ekle.
    2. Değilse,

      1. paddingIter, Completion(GetIterator(paddingOption, sync)) olsun.

      2. IfAbruptCloseIterators(paddingIter, iters) işlemini gerçekleştir.

      3. usingIterator, true olsun.

      4. iterCount kez tekrarla:

         1. Eğer *usingIterator* `true` ise, o zaman
        
                   1. *next*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([IteratorStepValue](08_sec-abstract-operations.md#sec-iteratorstepvalue)(*paddingIter*)) olsun.
        
                   2. [IfAbruptCloseIterators](08_sec-abstract-operations.md#sec-ifabruptcloseiterators)(*next*, *iters*) işlemini gerçekleştir.
        
                   3. Eğer *next* `done` ise, o zaman
        
                             1. *usingIterator* değerini `false` olarak ayarla.
        
                   4. Değilse,
        
                             1. *next* değerini *padding* listesine ekle.
        
         2. Eğer *usingIterator* `false` ise, *padding* listesine `undefined` ekle.
      5. Eğer usingIterator true ise, o zaman

         1. *completion*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*paddingIter*, [NormalCompletion](07_sec-ecmascript-data-types-and-values.md#sec-normalcompletion)(`unused`)))) olsun.
        
         2. [IfAbruptCloseIterators](08_sec-abstract-operations.md#sec-ifabruptcloseiterators)(*completion*, *iters*) işlemini gerçekleştir.
  15. finishResults, (results) parametrelerine sahip, hiçbir şey yakalamayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. CreateArrayFromList(results) döndür.
  16. IteratorZip(iters, mode, padding, finishResults) döndür.

27.1.3.2.5 Iterator.zipKeyed ( iterables [ , options ] )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer iterables bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  2. options nesnesini ? GetOptionsObject(options) olarak ayarla.

  3. mode, ? Get(options, "mode") olsun.

  4. Eğer mode undefined ise, mode değerini "shortest" olarak ayarla.

  5. Eğer mode; "shortest", "longest" veya "strict" değerlerinden biri değilse, bir TypeError istisnası fırlat.

  6. paddingOption, undefined olsun.

  7. Eğer mode "longest" ise, o zaman

    1. paddingOption değerini ? Get(options, "padding") olarak ayarla.

    2. Eğer paddingOption undefined değilse ve paddingOption bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  8. iters, yeni ve boş bir Liste (List) olsun.

  9. padding, yeni ve boş bir Liste (List) olsun.

  10. allKeys, ? iterables.[[OwnPropertyKeys]]() olsun.

  11. keys, yeni ve boş bir Liste (List) olsun.

  12. allKeys listesindeki her bir key elemanı için sırayla yap:

    1. propertyDesc, Completion(iterables.[[GetOwnProperty]](key)) olsun.

    2. IfAbruptCloseIterators(propertyDesc, iters) işlemini gerçekleştir.

    3. Eğer propertyDesc undefined değilse ve propertyDesc.[[Enumerable]] true ise, o zaman

      1. value, Completion(Get(iterables, key)) olsun.

      2. IfAbruptCloseIterators(value, iters) işlemini gerçekleştir.

      3. Eğer value undefined değilse, o zaman

           1. *key* değerini *keys* listesine ekle.
        
           2. *iter*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([GetIteratorFlattenable](08_sec-abstract-operations.md#sec-getiteratorflattenable)(*value*, `reject-primitives`)) olsun.
        
           3. [IfAbruptCloseIterators](08_sec-abstract-operations.md#sec-ifabruptcloseiterators)(*iter*, *iters*) işlemini gerçekleştir.
        
           4. *iter* değerini *iters* listesine ekle.
  13. iterCount, iters listesindeki eleman sayısı olsun.

  14. Eğer mode "longest" ise, o zaman

    1. Eğer paddingOption undefined ise, o zaman

      1. iterCount kez tekrarla:

         1. *padding* listesine `undefined` ekle.
    2. Değilse,

      1. keys listesindeki her bir key elemanı için sırayla yap:

         1. *value*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([Get](08_sec-abstract-operations.md#sec-get-o-p)(*paddingOption*, *key*)) olsun.
        
         2. [IfAbruptCloseIterators](08_sec-abstract-operations.md#sec-ifabruptcloseiterators)(*value*, *iters*) işlemini gerçekleştir.
        
         3. *value* değerini *padding* listesine ekle.
  15. finishResults, (results) parametrelerine sahip, keys ve iterCount değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. obj, OrdinaryObjectCreate(null) olsun.

    2. 0 ≤ i < iterCount koşulunu sağlayan her bir i tamsayısı (integer) için artan sırada yap:

      1. ! CreateDataPropertyOrThrow(obj, keys[i], results[i]) işlemini gerçekleştir.
    3. obj döndür.

  16. IteratorZip(iters, mode, padding, finishResults) döndür.

27.1.3.3 Iterator Prototip Nesnesinin Özellikleri (Properties of the Iterator Prototype Object)

Iterator prototip nesnesi:

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructor { [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahip bir erişimci özelliktir (accessor property). [[Get]] ve [[Set]] öznitelikleri aşağıdaki gibi tanımlanmıştır:

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Get]] özniteliğinin değeri, hiçbir argüman gerektirmeyen yerleşik bir fonksiyondur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. %Iterator% döndür.
27.1.3.3.1.2 set Iterator.prototype.constructor

[[Set]] özniteliğinin değeri, bir v argümanı alan yerleşik bir fonksiyondur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? SetterThatIgnoresPrototypeProperties(this değeri, %Iterator.prototype%, "constructor", v) işlemini gerçekleştir.

  2. undefined döndür.

27.1.3.3.2 Iterator.prototype.drop ( limit )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. numberLimit, Completion(ToNumber(limit)) olsun.

  5. IfAbruptCloseIterator(numberLimit, iterated) işlemini gerçekleştir.

  6. Eğer numberLimit NaN ise, o zaman

    1. error, yeni oluşturulmuş bir RangeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  7. intLimit, ! ToIntegerOrInfinity(numberLimit) olsun.

  8. Eğer intLimit < 0 ise, o zaman

    1. error, yeni oluşturulmuş bir RangeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  9. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  10. closure, hiçbir parametre almayan, iterated ve intLimit değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. remaining, intLimit olsun.

    2. remaining > 0 olduğu sürece tekrarla:

      1. Eğer remaining ≠ +∞ ise, o zaman

         1. *remaining* değerini *remaining* - 1 olarak ayarla.
      2. next, ? IteratorStep(iterated) olsun.

      3. Eğer next done ise, ReturnCompletion(undefined) döndür.

    3. Tekrarla,

      1. value, ? IteratorStepValue(iterated) olsun.

      2. Eğer value done ise, ReturnCompletion(undefined) döndür.

      3. completion, Completion(Yield(value)) olsun.

      4. IfAbruptCloseIterator(completion, iterated) işlemini gerçekleştir.

  11. result, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  12. result.[[UnderlyingIterators]] değerini « iterated » olarak ayarla.

  13. result döndür.

27.1.3.3.3 Iterator.prototype.every ( predicate )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(predicate) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. counter, 0 olsun.

  7. Tekrarla,

    1. value, ? IteratorStepValue(iterated) olsun.

    2. Eğer value done ise, true döndür.

    3. result, Completion(Call(predicate, undefined, « value, 𝔽(counter) »)) olsun.

    4. IfAbruptCloseIterator(result, iterated) işlemini gerçekleştir.

    5. Eğer ToBoolean(result) false ise, ? IteratorClose(iterated, NormalCompletion(false)) döndür.

    6. counter değerini counter + 1 olarak ayarla.

27.1.3.3.4 Iterator.prototype.filter ( predicate )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(predicate) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. closure, hiçbir parametre almayan, iterated ve predicate değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. counter, 0 olsun.

    2. Tekrarla,

      1. value, ? IteratorStepValue(iterated) olsun.

      2. Eğer value done ise, ReturnCompletion(undefined) döndür.

      3. selected, Completion(Call(predicate, undefined, « value, 𝔽(counter) »)) olsun.

      4. IfAbruptCloseIterator(selected, iterated) işlemini gerçekleştir.

      5. Eğer ToBoolean(selected) true ise, o zaman

           1. *completion*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([Yield](#sec-yield)(*value*)) olsun.
        
           2. [IfAbruptCloseIterator](08_sec-abstract-operations.md#sec-ifabruptcloseiterator)(*completion*, *iterated*) işlemini gerçekleştir.
      6. counter değerini counter + 1 olarak ayarla.

  7. result, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  8. result.[[UnderlyingIterators]] değerini « iterated » olarak ayarla.

  9. result döndür.

27.1.3.3.5 Iterator.prototype.find ( predicate )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(predicate) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. counter, 0 olsun.

  7. Tekrarla,

    1. value, ? IteratorStepValue(iterated) olsun.

    2. Eğer value done ise, undefined döndür.

    3. result, Completion(Call(predicate, undefined, « value, 𝔽(counter) »)) olsun.

    4. IfAbruptCloseIterator(result, iterated) işlemini gerçekleştir.

    5. Eğer ToBoolean(result) true ise, ? IteratorClose(iterated, NormalCompletion(value)) döndür.

    6. counter değerini counter + 1 olarak ayarla.

27.1.3.3.6 Iterator.prototype.flatMap ( mapper )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(mapper) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. closure, hiçbir parametre almayan, iterated ve mapper değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. counter, 0 olsun.

    2. Tekrarla,

      1. value, ? IteratorStepValue(iterated) olsun.

      2. Eğer value done ise, ReturnCompletion(undefined) döndür.

      3. mapped, Completion(Call(mapper, undefined, « value, 𝔽(counter) »)) olsun.

      4. IfAbruptCloseIterator(mapped, iterated) işlemini gerçekleştir.

      5. innerIterator, Completion(GetIteratorFlattenable(mapped, reject-primitives)) olsun.

      6. IfAbruptCloseIterator(innerIterator, iterated) işlemini gerçekleştir.

      7. innerAlive, true olsun.

      8. innerAlive true olduğu sürece tekrarla:

         1. *innerValue*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([IteratorStepValue](08_sec-abstract-operations.md#sec-iteratorstepvalue)(*innerIterator*))) olsun.
        
         2. [IfAbruptCloseIterator](08_sec-abstract-operations.md#sec-ifabruptcloseiterator)(*innerValue*, *iterated*) işlemini gerçekleştir.
        
         3. Eğer *innerValue* `done` ise, o zaman
        
                   1. *innerAlive* değerini `false` olarak ayarla.
        
         4. Değilse,
        
                   1. *completion*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([Yield](#sec-yield)(*innerValue*)) olsun.
        
                   2. Eğer *completion* bir [ani tamamlanma (abrupt completion)](07_sec-ecmascript-data-types-and-values.md#sec-completion-record-specification-type) ise, o zaman
        
                             1. *backupCompletion*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*innerIterator*, *completion*)) olsun.
        
                             2. [IfAbruptCloseIterator](08_sec-abstract-operations.md#sec-ifabruptcloseiterator)(*backupCompletion*, *iterated*) işlemini gerçekleştir.
        
                             3. ? [IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*iterated*, *completion*) döndür.
      9. counter değerini counter + 1 olarak ayarla.

  7. result, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  8. result.[[UnderlyingIterators]] değerini « iterated » olarak ayarla.

  9. result döndür.

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(procedure) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. counter, 0 olsun.

  7. Tekrarla,

    1. value, ? IteratorStepValue(iterated) olsun.

    2. Eğer value done ise, undefined döndür.

    3. result, Completion(Call(procedure, undefined, « value, 𝔽(counter) »)) olsun.

    4. IfAbruptCloseIterator(result, iterated) işlemini gerçekleştir.

    5. counter değerini counter + 1 olarak ayarla.

27.1.3.3.8 Iterator.prototype.map ( mapper )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(mapper) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. closure, hiçbir parametre almayan, iterated ve mapper değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. counter, 0 olsun.

    2. Tekrarla,

      1. value, ? IteratorStepValue(iterated) olsun.

      2. Eğer value done ise, ReturnCompletion(undefined) döndür.

      3. mapped, Completion(Call(mapper, undefined, « value, 𝔽(counter) »)) olsun.

      4. IfAbruptCloseIterator(mapped, iterated) işlemini gerçekleştir.

      5. completion, Completion(Yield(mapped)) olsun.

      6. IfAbruptCloseIterator(completion, iterated) işlemini gerçekleştir.

      7. counter değerini counter + 1 olarak ayarla.

  7. result, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  8. result.[[UnderlyingIterators]] değerini « iterated » olarak ayarla.

  9. result döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(reducer) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. Eğer initialValue mevcut değilse, o zaman

    1. accumulator, ? IteratorStepValue(iterated) olsun.

    2. Eğer accumulator done ise, bir TypeError istisnası fırlat.

    3. counter, 1 olsun.

  7. Değilse,

    1. accumulator, initialValue olsun.

    2. counter, 0 olsun.

  8. Tekrarla,

    1. value, ? IteratorStepValue(iterated) olsun.

    2. Eğer value done ise, accumulator döndür.

    3. result, Completion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »)) olsun.

    4. IfAbruptCloseIterator(result, iterated) işlemini gerçekleştir.

    5. accumulator değerini result olarak ayarla.

    6. counter değerini counter + 1 olarak ayarla.

27.1.3.3.10 Iterator.prototype.some ( predicate )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. Eğer IsCallable(predicate) false ise, o zaman

    1. error, yeni oluşturulmuş bir TypeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  5. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  6. counter, 0 olsun.

  7. Tekrarla,

    1. value, ? IteratorStepValue(iterated) olsun.

    2. Eğer value done ise, false döndür.

    3. result, Completion(Call(predicate, undefined, « value, 𝔽(counter) »)) olsun.

    4. IfAbruptCloseIterator(result, iterated) işlemini gerçekleştir.

    5. Eğer ToBoolean(result) true ise, ? IteratorClose(iterated, NormalCompletion(true)) döndür.

    6. counter değerini counter + 1 olarak ayarla.

27.1.3.3.11 Iterator.prototype.take ( limit )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } Yineleyici Kaydı (Iterator Record) olsun.

  4. numberLimit, Completion(ToNumber(limit)) olsun.

  5. IfAbruptCloseIterator(numberLimit, iterated) işlemini gerçekleştir.

  6. Eğer numberLimit NaN ise, o zaman

    1. error, yeni oluşturulmuş bir RangeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  7. intLimit, ! ToIntegerOrInfinity(numberLimit) olsun.

  8. Eğer intLimit < 0 ise, o zaman

    1. error, yeni oluşturulmuş bir RangeError nesnesinin ThrowCompletion sonucu olsun.

    2. ? IteratorClose(iterated, error) döndür.

  9. ? GetIteratorDirect(obj) ile iterated kaydını güncelle.

  10. closure, hiçbir parametre almayan, iterated ve intLimit değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. remaining, intLimit olsun.

    2. Tekrarla,

      1. Eğer remaining = 0 ise, o zaman

         1. ? [IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*iterated*, [ReturnCompletion](07_sec-ecmascript-data-types-and-values.md#sec-returncompletion)(`undefined`)) döndür.
      2. Eğer remaining ≠ +∞ ise, o zaman

         1. *remaining* değerini *remaining* - 1 olarak ayarla.
      3. value, ? IteratorStepValue(iterated) olsun.

      4. Eğer value done ise, ReturnCompletion(undefined) döndür.

      5. completion, Completion(Yield(value)) olsun.

      6. IfAbruptCloseIterator(completion, iterated) işlemini gerçekleştir.

  11. result, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  12. result.[[UnderlyingIterators]] değerini « iterated » olarak ayarla.

  13. result döndür.

27.1.3.3.12 Iterator.prototype.toArray ( )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. iterated, ? GetIteratorDirect(obj) olsun.

  4. items, yeni ve boş bir Liste (List) olsun.

  5. Tekrarla,

    1. value, ? IteratorStepValue(iterated) olsun.

    2. Eğer value done ise, CreateArrayFromList(items) döndür.

    3. value değerini items listesine ekle.

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

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin değeri "[Symbol.iterator]" şeklindedir.

27.1.3.3.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%] { [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahip bir erişimci özelliktir (accessor property). [[Get]] ve [[Set]] öznitelikleri aşağıdaki gibi tanımlanmıştır:

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

[[Get]] özniteliğinin değeri, hiçbir argüman gerektirmeyen yerleşik bir fonksiyondur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. "Iterator" döndür.
27.1.3.3.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]

[[Set]] özniteliğinin değeri, bir v argümanı alan yerleşik bir fonksiyondur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? SetterThatIgnoresPrototypeProperties(this değeri, %Iterator.prototype%, %Symbol.toStringTag%, v) işlemini gerçekleştir.

  2. undefined döndür.

27.1.3.4 Yineleyiciler İçin Soyut İşlemler (Abstract Operations for Iterators)

27.1.3.4.1 IteratorZip ( iters, mode, padding, finishResults )

IteratorZip soyut işlemi; iters (yineleyici kayıtlarının bir Listesi), mode ("shortest", "longest" veya "strict"), padding (ECMAScript dil değerlerinin bir Listesi) ve finishResults (ECMAScript dil değerlerinin bir Listesini alan ve bir ECMAScript dil değeri döndüren bir Soyut Kapanış) argümanlarını alır ve bir Generator döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. iterCount, iters listesindeki eleman sayısı olsun.

  2. openIters, iters listesinin bir kopyası olsun.

  3. closure, hiçbir parametre almayan, iters, iterCount, openIters, mode, padding ve finishResults değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Eğer iterCount = 0 ise, ReturnCompletion(undefined) döndür.

    2. Tekrarla,

      1. results, yeni ve boş bir Liste (List) olsun.

      2. Assert: openIters boş değildir.

      3. 0 ≤ i < iterCount koşulunu sağlayan her bir tamsayı (integer) i için artan sırada yap:

         1. *iter*, *iters*[*i*] olsun.
        
         2. Eğer *iter* `null` ise, o zaman
        
                   1. [Assert](06_sec-notational-conventions.md#assert): *mode* `"longest"` değeridir.
        
                   2. *result*, *padding*[*i*] olsun.
        
         3. Değilse,
        
                   1. *result*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([IteratorStepValue](08_sec-abstract-operations.md#sec-iteratorstepvalue)(*iter*))) olsun.
        
                   2. Eğer *result* bir [ani tamamlanma (abrupt completion)](07_sec-ecmascript-data-types-and-values.md#sec-completion-record-specification-type) ise, o zaman
        
                             1. *iter* elemanını *openIters* listesinden çıkar.
        
                             2. ? [IteratorCloseAll](08_sec-abstract-operations.md#sec-iteratorcloseall)(*openIters*, *result*) döndür.
        
                   3. *result* değerini ! *result* olarak güncelle.
        
                   4. Eğer *result* `done` ise, o zaman
        
                             1. *iter* elemanını *openIters* listesinden çıkar.
        
                             2. Eğer *mode* `"shortest"` ise, o zaman
        
                                       1. ? [IteratorCloseAll](08_sec-abstract-operations.md#sec-iteratorcloseall)(*openIters*, [ReturnCompletion](07_sec-ecmascript-data-types-and-values.md#sec-returncompletion)(`undefined`)) döndür.
        
                             3. Değilse eğer *mode* `"strict"` ise, o zaman
        
                                       1. Eğer *i* ≠ 0 ise, o zaman
        
                                                 1. ? [IteratorCloseAll](08_sec-abstract-operations.md#sec-iteratorcloseall)(*openIters*, [ThrowCompletion](07_sec-ecmascript-data-types-and-values.md#sec-throwcompletion)(yeni oluşturulmuş bir `TypeError` nesnesi)) döndür.
        
                                       2. 1 ≤ *k* < *iterCount* koşulunu sağlayan her bir [tamsayı (integer)](06_sec-notational-conventions.md#integer) *k* için artan sırada yap:
        
                                                 1. [Assert](06_sec-notational-conventions.md#assert): *iters*[*k*] `null` değildir.
        
                                                 2. *open*, [Completion](06_sec-notational-conventions.md#sec-completion-ao)([IteratorStep](08_sec-abstract-operations.md#sec-iteratorstep)(*iters*[*k*]))) olsun.
        
                                                 3. Eğer *open* bir [ani tamamlanma (abrupt completion)](07_sec-ecmascript-data-types-and-values.md#sec-completion-record-specification-type) ise, o zaman
        
                                                           1. *iters*[*k*] elemanını *openIters* listesinden çıkar.
        
                                                           2. ? [IteratorCloseAll](08_sec-abstract-operations.md#sec-iteratorcloseall)(*openIters*, *open*) döndür.
        
                                                 4. *open* değerini ! *open* olarak güncelle.
        
                                                 5. Eğer *open* `done` ise, o zaman
        
                                                           1. *iters*[*k*] elemanını *openIters* listesinden çıkar.
        
                                                 6. Değilse,
        
                                                           1. ? [IteratorCloseAll](08_sec-abstract-operations.md#sec-iteratorcloseall)(*openIters*, [ThrowCompletion](07_sec-ecmascript-data-types-and-values.md#sec-throwcompletion)(yeni oluşturulmuş bir `TypeError` nesnesi)) döndür.
        
                                       3. [ReturnCompletion](07_sec-ecmascript-data-types-and-values.md#sec-returncompletion)(`undefined`) döndür.
        
                             4. Değilse,
        
                                       1. [Assert](06_sec-notational-conventions.md#assert): *mode* `"longest"` değeridir.
        
                                       2. Eğer *openIters* boş ise, [ReturnCompletion](07_sec-ecmascript-data-types-and-values.md#sec-returncompletion)(`undefined`) döndür.
        
                                       3. *iters*[*i*] değerini `null` olarak ayarla.
        
                                       4. *result*, *padding*[*i*] olsun.
        
         4. *result* değerini *results* listesine ekle.
      4. results değerini finishResults(results) olarak güncelle.

      5. completion, Completion(Yield(results)) olsun.

      6. IfAbruptCloseIterators(completion, openIters) işlemini gerçekleştir.

  4. gen, CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») olsun.

  5. gen.[[UnderlyingIterators]] değerini openIters olarak ayarla.

  6. gen döndür.

27.1.4 %AsyncIteratorPrototype% Nesnesi (The %AsyncIteratorPrototype% Object)

%AsyncIteratorPrototype% nesnesi:

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

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin değeri "[Symbol.asyncIterator]" şeklindedir.

27.1.5 Async-from-Sync Yineleyici Nesneleri (Async-from-Sync Iterator Objects)

Bir Async-from-Sync Yineleyici nesnesi, belirli bir senkron yineleyiciyi (iterator) uyarlayan bir asenkron yineleyicidir (async iterator). Async-from-Sync Yineleyici nesnelerine ECMAScript kodu tarafından hiçbir zaman doğrudan erişilemez. Async-from-Sync Yineleyici nesneleri için adlandırılmış bir yapıcı (constructor) bulunmamaktadır. Bunun yerine Async-from-Sync Yineleyici nesneleri, gerektiğinde CreateAsyncFromSyncIterator soyut işlemi tarafından oluşturulur.

27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

CreateAsyncFromSyncIterator soyut işlemi; syncIteratorRecord (bir Yineleyici Kaydı) argümanını alır ve bir Yineleyici Kaydı döndürür. Senkron bir Yineleyici Kaydından asenkron bir Yineleyici Kaydı oluşturmak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. asyncIterator, OrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] ») olsun.

  2. asyncIterator.[[SyncIteratorRecord]] değerini syncIteratorRecord olarak ayarla.

  3. nextMethod, ! Get(asyncIterator, "next") olsun.

  4. iteratorRecord, { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } Yineleyici Kaydı olsun.

  5. iteratorRecord döndür.

27.1.5.2 %AsyncFromSyncIteratorPrototype% Nesnesi (The %AsyncFromSyncIteratorPrototype% Object)

%AsyncFromSyncIteratorPrototype% nesnesi:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )
  1. obj, this değeri olsun.

  2. Assert: obj, [[SyncIteratorRecord]] dahili yuvasına sahip bir Nesnedir (is an Object).

  3. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  4. syncIteratorRecord, obj.[[SyncIteratorRecord]] olsun.

  5. Eğer value mevcutsa, o zaman

    1. result, Completion(IteratorNext(syncIteratorRecord, value)) olsun.
  6. Değilse,

    1. result, Completion(IteratorNext(syncIteratorRecord)) olsun.
  7. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) döndür.

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )
  1. obj, this değeri olsun.

  2. Assert: obj, [[SyncIteratorRecord]] dahili yuvasına sahip bir Nesnedir (is an Object).

  3. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  4. syncIteratorRecord, obj.[[SyncIteratorRecord]] olsun.

  5. syncIterator, syncIteratorRecord.[[Iterator]] olsun.

  6. return, Completion(GetMethod(syncIterator, "return")) olsun.

  7. IfAbruptRejectPromise(return, promiseCapability) işlemini gerçekleştir.

  8. Eğer return undefined ise, o zaman

    1. iteratorResult, CreateIteratorResultObject(value, true) olsun.

    2. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») işlemini gerçekleştir.

    3. promiseCapability.[[Promise]] döndür.

  9. Eğer value mevcutsa, o zaman

    1. result, Completion(Call(return, syncIterator, « value »)) olsun.
  10. Değilse,

    1. result, Completion(Call(return, syncIterator)) olsun.
  11. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  12. Eğer result bir Nesne değilse (is not an Object), o zaman

    1. ! Call(promiseCapability.[[Reject]], undefined, « yeni oluşturulmuş bir TypeError nesnesi ») işlemini gerçekleştir.

    2. promiseCapability.[[Promise]] döndür.

  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false) döndür.

27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )
  1. obj, this değeri olsun.

  2. Assert: obj, [[SyncIteratorRecord]] dahili yuvasına sahip bir Nesnedir (is an Object).

  3. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  4. syncIteratorRecord, obj.[[SyncIteratorRecord]] olsun.

  5. syncIterator, syncIteratorRecord.[[Iterator]] olsun.

  6. throw, Completion(GetMethod(syncIterator, "throw")) olsun.

  7. IfAbruptRejectPromise(throw, promiseCapability) işlemini gerçekleştir.

  8. Eğer throw undefined ise, o zaman

    1. NOTE: Eğer syncIterator bir throw metoduna sahip değilse, yeteneği (capability) reddetmeden önce ona temizleme şansı vermek için onu kapatın.

    2. closeCompletion, NormalCompletion(empty) olsun.

    3. result, Completion(IteratorClose(syncIteratorRecord, closeCompletion)) olsun.

    4. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

    5. NOTE: Bir sonraki adım, protokol ihlali olduğunu göstermek için bir TypeError fırlatır: syncIterator bir throw metoduna sahip değildir.

    6. NOTE: Eğer syncIterator nesnesini kapatmak fırlatmazsa (throw), o işlemin sonucu reddedilmiş bir promise üretse bile yoksayılır.

    7. ! Call(promiseCapability.[[Reject]], undefined, « yeni oluşturulmuş bir TypeError nesnesi ») işlemini gerçekleştir.

    8. promiseCapability.[[Promise]] döndür.

  9. Eğer value mevcutsa, o zaman

    1. result, Completion(Call(throw, syncIterator, « value »)) olsun.
  10. Değilse,

    1. result, Completion(Call(throw, syncIterator)) olsun.
  11. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  12. Eğer result bir Nesne değilse (is not an Object), o zaman

    1. ! Call(promiseCapability.[[Reject]], undefined, « yeni oluşturulmuş bir TypeError nesnesi ») işlemini gerçekleştir.

    2. promiseCapability.[[Promise]] döndür.

  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) döndür.

27.1.5.3 Async-from-Sync Yineleyici Örneklerinin Özellikleri (Properties of Async-from-Sync Iterator Instances)

Async-from-Sync Yineleyici (Iterator) örnekleri, %AsyncFromSyncIteratorPrototype% yerleşik nesnesinden özellikleri miras alan sıradan nesnelerdir (ordinary objects). Async-from-Sync Yineleyici (Iterator) örnekleri başlangıçta Tablo 85 içinde listelenen dahili yuvalarla oluşturulur.

Tablo 85: Async-from-Sync Yineleyici (Iterator) Örneklerinin Dahili Yuvaları

Dahili Yuva Tür Açıklama
[[SyncIteratorRecord]] bir Yineleyici Kaydı (Iterator Record) Uyarlanmakta olan orijinal senkron yineleyiciyi (iterator) temsil eder.

27.1.5.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

AsyncFromSyncIteratorContinuation soyut işlemi; result (bir Nesne), promiseCapability (yerleşik %Promise% için bir PromiseCapability Kaydı), syncIteratorRecord (bir Yineleyici Kaydı) ve closeOnRejection (bir Boolean) argümanlarını alır ve bir Promise döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NOTE: promiseCapability, yerleşik %Promise% nesnesinden türetildiği için, aşağıdaki IfAbruptRejectPromise kullanımı gereği promiseCapability.[[Reject]] metoduna yapılan çağrıların fırlatmayacağı garanti edilir.

  2. done, Completion(IteratorComplete(result))) olsun.

  3. IfAbruptRejectPromise(done, promiseCapability) işlemini gerçekleştir.

  4. value, Completion(IteratorValue(result))) olsun.

  5. IfAbruptRejectPromise(value, promiseCapability) işlemini gerçekleştir.

  6. valueWrapper, Completion(PromiseResolve(%Promise%, value)) olsun.

  7. Eğer valueWrapper bir ani tamamlanma (abrupt completion) ise, done false ise ve closeOnRejection true ise, o zaman

    1. valueWrapper değerini Completion(IteratorClose(syncIteratorRecord, valueWrapper)) olarak güncelle.
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability) işlemini gerçekleştir.

  9. unwrap, (v) parametrelerine sahip, done değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. CreateIteratorResultObject(v, done) döndür.
  10. onFulfilled, CreateBuiltinFunction(unwrap, 1, "", « ») olsun.

  11. NOTE: onFulfilled, bir IteratorResult nesnesinin "value" özelliğini işlerken, eğer bu değer bir promise ise değerini beklemek ve sonucu yeni bir "sarmalanmamış" (unwrapped) IteratorResult nesnesi içinde yeniden paketlemek için kullanılır.

  12. Eğer done true ise veya closeOnRejection false ise, o zaman

    1. onRejected, undefined olsun.
  13. Değilse,

    1. closeIterator, (error) parametrelerine sahip, syncIteratorRecord değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. ? IteratorClose(syncIteratorRecord, ThrowCompletion(error)) döndür.
    2. onRejected, CreateBuiltinFunction(closeIterator, 1, "", « ») olsun.

    3. NOTE: onRejected, yielded ettiği bir IteratorResult nesnesinin "value" özelliği reddedilmiş bir promise olduğunda Yineleyiciyi (Iterator) kapatmak için kullanılır.

  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability) işlemini gerçekleştir.

  15. promiseCapability.[[Promise]] döndür.

27.2 Promise Nesneleri (Promise Objects)

Bir Promise, ertelenmiş (ve muhtemelen asenkron) bir hesaplamanın nihai sonuçları için bir yer tutucu olarak kullanılan bir nesnedir.

Herhangi bir Promise, karşılıkelijk olarak dışlayıcı olan üç durumdan birindedir: fulfilled (yerine getirilmiş), rejected (reddedilmiş) ve pending (beklemede):

  • Eğer p.then(f, r) çağrısı hemen f fonksiyonunu çağırmak üzere bir İş (Job) kuyruğa ekliyorsa, p promise'i yerine getirilmiştir (fulfilled).

  • Eğer p.then(f, r) çağrısı hemen r fonksiyonunu çağırmak üzere bir İş (Job) kuyruğa ekliyorsa, p promise'i reddedilmiştir (rejected).

  • Eğer bir promise ne yerine getirilmiş ne de reddedilmişse, beklemededir (pending).

Bir promise beklemede değilse, yani yerine getirilmiş veya reddedilmişse, karara bağlanmış (settled) olarak adlandırılır.

Bir promise karara bağlanmışsa veya başka bir promise'in durumuna uyması için "kilitlenmişse" çözümlenmiş (resolved) olarak adlandırılır. Çözümlenmiş bir promise'i çözümlemeye veya reddetmeye çalışmanın hiçbir etkisi yoktur. Bir promise çözümlenmemişse, çözümlenmemiş (unresolved) olarak adlandırılır. Çözümlenmemiş bir promise her zaman beklemede (pending) durumundadır. Çözümlenmiş bir promise; beklemede, yerine getirilmiş veya reddedilmiş olabilir.

27.2.1 Promise Soyut İşlemleri (Promise Abstract Operations)

27.2.1.1 PromiseCapability Kayıtları (PromiseCapability Records)

Bir PromiseCapability Kaydı (PromiseCapability Record), bir Promise veya promise benzeri bir nesneyi, o promise'i çözümleme (resolving) veya reddetme (rejecting) yeteneğine sahip fonksiyonlarla birlikte kapsüllemek için kullanılan bir Kayıt (Record) değeridir. PromiseCapability Kayıtları, NewPromiseCapability soyut işlemi tarafından üretilir.

PromiseCapability Kayıtları, Tablo 86 içinde listelenen alanlara sahiptir.

Tablo 86: PromiseCapability Kaydı Alanları

Alan Adı Değer Anlamı
[[Promise]] bir Nesne Promise olarak kullanılabilen bir nesne.
[[Resolve]] bir fonksiyon nesnesi (function object) Belirtilen promise'i çözümlemek için kullanılan fonksiyon.
[[Reject]] bir fonksiyon nesnesi (function object) Belirtilen promise'i reddetmek için kullanılan fonksiyon.
27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise soyut işlemi, bir PromiseCapability Kaydı (PromiseCapability Record) kullanan bir algoritma adımları dizisinin kısaltmasıdır. Aşağıdaki biçimdeki bir algoritma adımı:

  1. IfAbruptRejectPromise(value, capability) işlemini gerçekleştir.

şu anlama gelir:

  1. Assert: value, bir Tamamlanma Kaydıdır (Completion Record).

  2. Eğer value bir ani tamamlanma (abrupt completion) ise, o zaman

    1. ? Call(capability.[[Reject]], undefined, « value.[[Value]] ») işlemini gerçekleştir.

    2. capability.[[Promise]] döndür.

  3. value değerini ! value olarak güncelle.

27.2.1.2 PromiseReaction Kayıtları (PromiseReaction Records)

Bir PromiseReaction Kaydı (PromiseReaction Record), bir promise belirli bir değerle çözümlendiğinde (resolved) veya reddedildiğinde (rejected) nasıl tepki vermesi gerektiğine dair bilgileri depolamak için kullanılan bir Kayıt (Record) değeridir. PromiseReaction Kayıtları, PerformPromiseThen soyut işlemi tarafından oluşturulur ve NewPromiseReactionJob tarafından döndürülen Soyut Kapanış (Abstract Closure) tarafından kullanılır.

PromiseReaction Kayıtları, Tablo 87 içinde listelenen alanlara sahiptir.

Tablo 87: PromiseReaction Kaydı Alanları

Alan Adı Değer Anlamı
[[Capability]] bir PromiseCapability Kaydı veya undefined Bu kaydın bir reaksiyon işleyicisi (reaction handler) sağladığı promise'in yetenekleri (capabilities).
[[Type]] fulfill veya reject [[Type]] alanı, [[Handler]] empty olduğunda, karara bağlanma (settlement) türüne özgü davranışa izin vermek için kullanılır.
[[Handler]] bir JobCallback Kaydı (JobCallback Record) veya empty Gelen değere uygulanması gereken ve geri dönüş değeri türetilen promise'e ne olacağını belirleyecek olan fonksiyon. Eğer [[Handler]] empty ise, bunun yerine [[Type]] değerine bağlı bir fonksiyon kullanılacaktır.

27.2.1.3 CreateResolvingFunctions ( toResolve )

CreateResolvingFunctions soyut işlemi; toResolve (bir Promise) argümanını alır ve [[Resolve]] (bir fonksiyon nesnesi) ve [[Reject]] (bir fonksiyon nesnesi) alanlarına sahip bir Kayıt (Record) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. promiseOrEmpty, { [[Value]]: toResolve } Kaydı (Record) olsun.

  2. resolveSteps, (resolution) parametrelerine sahip, promiseOrEmpty kaydını yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Eğer promiseOrEmpty.[[Value]] empty ise, undefined döndür.

    2. promise, promiseOrEmpty.[[Value]] olsun.

    3. promiseOrEmpty.[[Value]] değerini empty olarak ayarla.

    4. Eğer SameValue(resolution, promise) true ise, o zaman

      1. selfResolutionError, yeni oluşturulmuş bir TypeError nesnesi olsun.

      2. RejectPromise(promise, selfResolutionError) işlemini gerçekleştir.

      3. undefined döndür.

    5. Eğer resolution bir Nesne değilse (is not an Object), o zaman

      1. FulfillPromise(promise, resolution) işlemini gerçekleştir.

      2. undefined döndür.

    6. then, Completion(Get(resolution, "then")) olsun.

    7. Eğer then bir ani tamamlanma (abrupt completion) ise, o zaman

      1. RejectPromise(promise, then.[[Value]]) işlemini gerçekleştir.

      2. undefined döndür.

    8. thenAction, then.[[Value]] olsun.

    9. Eğer IsCallable(thenAction) false ise, o zaman

      1. FulfillPromise(promise, resolution) işlemini gerçekleştir.

      2. undefined döndür.

    10. thenJobCallback, HostMakeJobCallback(thenAction) olsun.

    11. job, NewPromiseResolveThenableJob(promise, resolution, thenJobCallback) olsun.

    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) işlemini gerçekleştir.

    13. undefined döndür.

  3. resolve, CreateBuiltinFunction(resolveSteps, 1, "", « ») olsun.

  4. rejectSteps, (reason) parametrelerine sahip, promiseOrEmpty kaydını yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Eğer promiseOrEmpty.[[Value]] empty ise, undefined döndür.

    2. promise, promiseOrEmpty.[[Value]] olsun.

    3. promiseOrEmpty.[[Value]] değerini empty olarak ayarla.

    4. RejectPromise(promise, reason) işlemini gerçekleştir.

    5. undefined döndür.

  5. reject, CreateBuiltinFunction(rejectSteps, 1, "", « ») olsun.

  6. { [[Resolve]]: resolve, [[Reject]]: reject } Kaydını (Record) döndür.

27.2.1.4 FulfillPromise ( promise, value )

FulfillPromise soyut işlemi; promise (bir Promise) ve value (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: promise.[[PromiseState]] değeri pending'dir.

  2. reactions, promise.[[PromiseFulfillReactions]] olsun.

  3. promise.[[PromiseResult]] değerini value olarak ayarla.

  4. promise.[[PromiseFulfillReactions]] değerini undefined olarak ayarla.

  5. promise.[[PromiseRejectReactions]] değerini undefined olarak ayarla.

  6. promise.[[PromiseState]] değerini fulfilled olarak ayarla.

  7. TriggerPromiseReactions(reactions, value) işlemini gerçekleştir.

  8. unused döndür.

27.2.1.5 NewPromiseCapability ( ctor )

NewPromiseCapability soyut işlemi; ctor (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve bir PromiseCapability Kaydı (PromiseCapability Record) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Yerleşik Promise yapıcısının yöntemine benzer şekilde bir promise oluşturmak ve onun resolve ve reject fonksiyonlarını elde etmek için ctor argümanını bir yapıcı (constructor) olarak kullanmaya çalışır. Promise ve resolve and reject fonksiyonları, yeni bir PromiseCapability Kaydı (PromiseCapability Record) başlatmak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsConstructor(ctor) false ise, bir TypeError istisnası fırlat.

  2. NOTE: ctor argümanının, Promise yapıcısının (constructor) parametre kurallarını destekleyen bir yapıcı fonksiyon olduğu varsayılır (bakınız 27.2.3.1).

  3. resolvingFuncs, { [[Resolve]]: undefined, [[Reject]]: undefined } Kaydı (Record) olsun.

  4. executorClosure, (resolve, reject) parametrelerine sahip, resolvingFuncs kaydını yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Eğer resolvingFuncs.[[Resolve]] undefined değilse, bir TypeError istisnası fırlat.

    2. Eğer resolvingFuncs.[[Reject]] undefined değilse, bir TypeError istisnası fırlat.

    3. resolvingFuncs.[[Resolve]] değerini resolve olarak ayarla.

    4. resolvingFuncs.[[Reject]] değerini reject olarak ayarla.

    5. NormalCompletion(undefined) döndür.

  5. executor, CreateBuiltinFunction(executorClosure, 2, "", « ») olsun.

  6. promise, ? Construct(ctor, « executor ») olsun.

  7. Eğer IsCallable(resolvingFuncs.[[Resolve]]) false ise, bir TypeError istisnası fırlat.

  8. Eğer IsCallable(resolvingFuncs.[[Reject]]) false ise, bir TypeError istisnası fırlat.

  9. { [[Promise]]: promise, [[Resolve]]: resolvingFuncs.[[Resolve]], [[Reject]]: resolvingFuncs.[[Reject]] } PromiseCapability Kaydını (PromiseCapability Record) döndür.

27.2.1.6 IsPromise ( arg )

IsPromise soyut işlemi; arg (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve bir Boolean döndürür. Bir nesne üzerinde promise markasını (brand) kontrol eder. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer arg bir Nesne değilse (is not an Object), false döndür.

  2. Eğer arg bir [[PromiseState]] dahili yuvasına sahip değilse, false döndür.

  3. true döndür.

27.2.1.7 RejectPromise ( promise, reason )

RejectPromise soyut işlemi; promise (bir Promise) ve reason (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: promise.[[PromiseState]] değeri pending'dir.

  2. reactions, promise.[[PromiseRejectReactions]] olsun.

  3. promise.[[PromiseResult]] değerini reason olarak ayarla.

  4. promise.[[PromiseFulfillReactions]] değerini undefined olarak ayarla.

  5. promise.[[PromiseRejectReactions]] değerini undefined olarak ayarla.

  6. promise.[[PromiseState]] değerini rejected olarak ayarla.

  7. Eğer promise.[[PromiseIsHandled]] false ise, HostPromiseRejectionTracker(promise, "reject") işlemini gerçekleştir.

  8. TriggerPromiseReactions(reactions, reason) işlemini gerçekleştir.

  9. unused döndür.

27.2.1.8 TriggerPromiseReactions ( reactions, arg )

TriggerPromiseReactions soyut işlemi; reactions (PromiseReaction Kayıtlarının bir Listesi) ve arg (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve unused döndürür. reactions içindeki her bir kayıt için yeni bir İş (Job) kuyruğa ekler. Bu tür her bir İş (Job), PromiseReaction Kaydının (PromiseReaction Record) [[Type]] ve [[Handler]] alanlarını işler ve eğer [[Handler]] empty değilse, verilen argümanı geçirerek onu çağırır. Eğer [[Handler]] empty ise, davranış [[Type]] alanı tarafından belirlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. reactions listesindeki her bir reaction elemanı için sırayla yap:

    1. job, NewPromiseReactionJob(reaction, arg) olsun.

    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) işlemini gerçekleştir.

  2. unused döndür.

27.2.1.9 HostPromiseRejectionTracker ( promise, operation )

Ana bilgisayar tarafından tanımlanmış (host-defined) HostPromiseRejectionTracker soyut işlemi; promise (bir Promise) ve operation ("reject" veya "handle") argümanlarını alır ve unused döndürür. Ana bilgisayar ortamlarının (host environments) promise reddetmelerini izlemesine olanak tanır.

HostPromiseRejectionTracker varsayılan uygulaması, unused döndürmektir.

27.2.2 Promise İşleri (Promise Jobs)

27.2.2.1 NewPromiseReactionJob ( reaction, arg )

NewPromiseReactionJob soyut işlemi; reaction (bir PromiseReaction Kaydı) ve arg (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve [[Job]] (bir İş (Job) Soyut Kapanışı (Abstract Closure)) ve [[Realm]] (bir Realm Kaydı (Realm Record) veya null) alanlarına sahip bir Kayıt (Record) döndürür. Gelen değere uygun işleyiciyi uygulayan ve işleyicinin dönüş değerini o işleyiciyle ilişkili türetilmiş promise'i çözümlemek veya reddetmek için kullanan yeni bir İş (Job) Soyut Kapanışı (Abstract Closure) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. job, hiçbir parametre almayan, reaction ve arg değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir İş (Job) Soyut Kapanışı (Abstract Closure) olsun:

    1. promiseCapability, reaction.[[Capability]] olsun.

    2. type, reaction.[[Type]] olsun.

    3. handler, reaction.[[Handler]] olsun.

    4. Eğer handler empty ise, o zaman

      1. Eğer type fulfill ise, o zaman

           1. *handlerResult*, [NormalCompletion](07_sec-ecmascript-data-types-and-values.md#sec-normalcompletion)(*arg*) olsun.
      2. Değilse,

           1. [Assert](06_sec-notational-conventions.md#assert): *type* `reject` değeridir.
        
           2. *handlerResult*, [ThrowCompletion](07_sec-ecmascript-data-types-and-values.md#sec-throwcompletion)(*arg*) olsun.
    5. Değilse,

      1. handlerResult, Completion(HostCallJobCallback(handler, undefined, « arg »)) olsun.
    6. Eğer promiseCapability undefined ise, o zaman

      1. Assert: handlerResult bir ani tamamlanma (abrupt completion) değildir.

      2. empty döndür.

    7. Assert: promiseCapability, bir PromiseCapability Kaydıdır (PromiseCapability Record).

    8. Eğer handlerResult bir ani tamamlanma (abrupt completion) ise, o zaman

      1. ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») döndür.
    9. ? Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») döndür.

  2. handlerRealm, null olsun.

  3. Eğer reaction.[[Handler]] empty değilse, o zaman

    1. getHandlerRealmResult, Completion(GetFunctionRealm(reaction.[[Handler]].[[Callback]])) olsun.

    2. Eğer getHandlerRealmResult bir olağan tamamlanma (normal completion) ise, handlerRealm değerini getHandlerRealmResult.[[Value]] olarak ayarla.

    3. Değilse, handlerRealm değerini geçerli Realm Kaydı (the current Realm Record) olarak ayarla.

    4. NOTE: İşleyici (handler) undefined olmadığı sürece handlerRealm hiçbir zaman null olmaz. İşleyici iptal edilmiş (revoked) bir Proxy olduğunda ve hiçbir ECMAScript kodu çalışmadığında, hata nesneleri oluşturmak için handlerRealm kullanılır.

  4. { [[Job]]: job, [[Realm]]: handlerRealm } Kaydını (Record) döndür.

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

NewPromiseResolveThenableJob soyut işlemi; promiseToResolve (bir Promise), thenable (bir Nesne) ve then (bir JobCallback Kaydı (JobCallback Record)) argümanlarını alır ve [[Job]] (bir İş (Job) Soyut Kapanışı (Abstract Closure)) ve [[Realm]] (bir Realm Kaydı (Realm Record)) alanlarına sahip bir Kayıt (Record) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. job, hiçbir parametre almayan, promiseToResolve, thenable ve then değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir İş (Job) Soyut Kapanışı (Abstract Closure) olsun:

    1. resolvingFuncs, CreateResolvingFunctions(promiseToResolve) olsun.

    2. thenCallResult, Completion(HostCallJobCallback(then, thenable, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »)) olsun.

    3. Eğer thenCallResult bir ani tamamlanma (abrupt completion) ise, o zaman

      1. ? Call(resolvingFuncs.[[Reject]], undefined, « thenCallResult.[[Value]] ») döndür.
    4. ! thenCallResult döndür.

  2. getThenRealmResult, Completion(GetFunctionRealm(then.[[Callback]])) olsun.

  3. Eğer getThenRealmResult bir olağan tamamlanma (normal completion) ise, thenRealm değerini getThenRealmResult.[[Value]] olarak ayarla.

  4. Değilse, thenRealm değerini geçerli Realm Kaydı (the current Realm Record) olarak ayarla.

  5. NOTE: thenRealm hiçbir zaman null olmaz. then.[[Callback]] iptal edilmiş (revoked) bir Proxy olduğunda ve hiçbir kod çalışmadığında, hata nesneleri oluşturmak için thenRealm kullanılır.

  6. { [[Job]]: job, [[Realm]]: thenRealm } Kaydını (Record) döndür.

27.2.3 Promise Yapıcısı (The Promise Constructor)

Promise yapıcısı (constructor):

  • %Promise% nesnesidir.

  • global nesnenin (global object) "Promise" özelliğinin ilk değeridir.

  • bir yapıcı (constructor) olarak çağrıldığında yeni bir Promise oluşturur ve başlatır.

  • fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen Promise davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneğini Promise ve Promise.prototype yerleşik metotlarını desteklemek için gerekli dahili durumla oluşturmak ve başlatmak için Promise yapıcısına (constructor) bir super çağrısı içermelidir.

27.2.3.1 Promise ( executor )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. Eğer IsCallable(executor) false ise, bir TypeError istisnası fırlat.

  3. promise, ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») olsun.

  4. promise.[[PromiseState]] değerini pending olarak ayarla.

  5. promise.[[PromiseResult]] değerini empty olarak ayarla.

  6. promise.[[PromiseFulfillReactions]] değerini yeni ve boş bir Liste (List) olarak ayarla.

  7. promise.[[PromiseRejectReactions]] değerini yeni ve boş bir Liste (List) olarak ayarla.

  8. promise.[[PromiseIsHandled]] değerini false olarak ayarla.

  9. resolvingFuncs, CreateResolvingFunctions(promise) olsun.

  10. completion, Completion(Call(executor, undefined, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »)) olsun.

  11. Eğer completion bir ani tamamlanma (abrupt completion) ise, o zaman

    1. ? Call(resolvingFuncs.[[Reject]], undefined, « completion.[[Value]] ») işlemini gerçekleştir.
  12. promise döndür.

27.2.4 Promise Yapıcısının Özellikleri (Properties of the Promise Constructor)

Promise yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

27.2.4.1 Promise.all ( iterable )

Bu fonksiyon, geçirilen promise'ler için yerine getirme (fulfillment) değerlerinin bir dizisiyle yerine getirilen (fulfilled) yeni bir promise döndürür veya geçirilen ve reddedilen ilk promise'in gerekçesiyle (reason) reddeder. Bu algoritmayı çalıştırırken geçirilen yinelenebilir (iterable) nesnenin tüm elemanlarını promise olarak çözümler.

  1. ctor, this değeri olsun.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. promiseResolve, Completion(GetPromiseResolve(ctor)) olsun.

  4. IfAbruptRejectPromise(promiseResolve, promiseCapability) işlemini gerçekleştir.

  5. iteratorRecord, Completion(GetIterator(iterable, sync)) olsun.

  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability) işlemini gerçekleştir.

  7. result, Completion(PerformPromiseAll(iteratorRecord, ctor, promiseCapability, promiseResolve)) olsun.

  8. Eğer result bir ani tamamlanma (abrupt completion) ise, o zaman

    1. Eğer iteratorRecord.[[Done]] false ise, result değerini Completion(IteratorClose(iteratorRecord, result)) olarak güncelle.

    2. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  9. ! result döndür.

27.2.4.1.1 GetPromiseResolve ( promiseCtor )

GetPromiseResolve soyut işlemi; promiseCtor (bir yapıcı) argümanını alır ve bir function nesnesi içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. promiseResolve, ? Get(promiseCtor, "resolve") olsun.

  2. Eğer IsCallable(promiseResolve) false ise, bir TypeError istisnası fırlat.

  3. promiseResolve döndür.

27.2.4.1.2 PerformPromiseAll ( iteratorRecord, ctor, resultCapability, promiseResolve )

PerformPromiseAll soyut işlemi; iteratorRecord (bir Yineleyici Kaydı), ctor (bir yapıcı), resultCapability (bir PromiseCapability Kaydı) ve promiseResolve (bir fonksiyon nesnesi) argümanlarını alır ve bir Nesne içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. values, yeni ve boş bir Liste (List) olsun.

  2. NOTE: remainingElementsCount, girdi yineleyicisi (iterator) tükenmeden önce geçirilen geri çağırmayı çağıran hatalı çalışan bir "then" durumunda bile, resultCapability.[[Resolve]] metodunun yalnızca bir kez çağrılmasını sağlamak amacıyla 0 yerine 1'den başlar.

  3. remainingElementsCount, { [[Value]]: 1 } Kaydı (Record) olsun.

  4. index, 0 olsun.

  5. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, o zaman

      1. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      2. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

           1. *valuesArray*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*values*) olsun.
        
           2. ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Resolve]]*, `undefined`, « *valuesArray* ») işlemini gerçekleştir.
      3. resultCapability.[[Promise]] döndür.

    3. values listesine undefined ekle.

    4. nextPromise, ? Call(promiseResolve, ctor, « next ») olsun.

    5. fulfilledSteps, (value) parametrelerine sahip, values, resultCapability ve remainingElementsCount değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

      2. Eğer activeFunc.[[AlreadyCalled]] true ise, undefined döndür.

      3. activeFunc.[[AlreadyCalled]] değerini true olarak ayarla.

      4. thisIndex, activeFunc.[[Index]] olsun.

      5. values[thisIndex] değerini value olarak ayarla.

      6. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      7. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

           1. *valuesArray*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*values*) olsun.
        
           2. ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Resolve]]*, `undefined`, « *valuesArray* ») döndür.
      8. undefined döndür.

    6. onFulfilled, CreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») olsun.

    7. onFulfilled.[[AlreadyCalled]] değerini false olarak ayarla.

    8. onFulfilled.[[Index]] değerini index olarak ayarla.

    9. index değerini index + 1 olarak ayarla.

    10. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] + 1 olarak ayarla.

    11. ? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») işlemini gerçekleştir.

27.2.4.2 Promise.allSettled ( iterable )

Bu fonksiyon, yalnızca orijinal promise'lerin tümü karara bağlandıktan (settled) sonra, yani yerine getirildikten (fulfilled) veya reddedildikten (rejected) sonra, promise durum anlık görüntülerinin (snapshots) bir dizisi ile yerine getirilen (fulfilled) bir promise döndürür. Bu algoritmayı çalıştırırken geçirilen yinelenebilir (iterable) nesnenin tüm elemanlarını promise olarak çözümler.

  1. ctor, this değeri olsun.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. promiseResolve, Completion(GetPromiseResolve(ctor)) olsun.

  4. IfAbruptRejectPromise(promiseResolve, promiseCapability) işlemini gerçekleştir.

  5. iteratorRecord, Completion(GetIterator(iterable, sync)) olsun.

  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability) işlemini gerçekleştir.

  7. result, Completion(PerformPromiseAllSettled(iteratorRecord, ctor, promiseCapability, promiseResolve)) olsun.

  8. Eğer result bir ani tamamlanma (abrupt completion) ise, o zaman

    1. Eğer iteratorRecord.[[Done]] false ise, result değerini Completion(IteratorClose(iteratorRecord, result)) olarak güncelle.

    2. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  9. ! result döndür.

27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord, ctor, resultCapability, promiseResolve )

PerformPromiseAllSettled soyut işlemi; iteratorRecord (bir Yineleyici Kaydı), ctor (bir yapıcı), resultCapability (bir PromiseCapability Kaydı) ve promiseResolve (bir fonksiyon nesnesi) argümanlarını alır ve bir Nesne içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. values, yeni ve boş bir Liste (List) olsun.

  2. NOTE: remainingElementsCount, girdi yineleyicisi (iterator) tükenmeden önce geçirilen geri çağırmalardan birini çağıran hatalı çalışan bir "then" durumunda bile, resultCapability.[[Resolve]] metodunun yalnızca bir kez çağrılmasını sağlamak amacıyla 0 yerine 1'den başlar.

  3. remainingElementsCount, { [[Value]]: 1 } Kaydı (Record) olsun.

  4. index, 0 olsun.

  5. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, o zaman

      1. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      2. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

         1. *valuesArray*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*values*) olsun.
        
         2. ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Resolve]]*, `undefined`, « *valuesArray* ») işlemini gerçekleştir.
      3. resultCapability.[[Promise]] döndür.

    3. values listesine undefined ekle.

    4. nextPromise, ? Call(promiseResolve, ctor, « next ») olsun.

    5. alreadyCalled, { [[Value]]: false } Kaydı (Record) olsun.

    6. fulfilledSteps, (value) parametrelerine sahip, values, resultCapability ve remainingElementsCount değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

      2. Eğer activeFunc.[[AlreadyCalled]].[[Value]] true ise, undefined döndür.

      3. activeFunc.[[AlreadyCalled]].[[Value]] değerini true olarak ayarla.

      4. obj, OrdinaryObjectCreate(%Object.prototype%) olsun.

      5. ! CreateDataPropertyOrThrow(obj, "status", "fulfilled") işlemini gerçekleştir.

      6. ! CreateDataPropertyOrThrow(obj, "value", value) işlemini gerçekleştir.

      7. thisIndex, activeFunc.[[Index]] olsun.

      8. values[thisIndex] değerini obj olarak ayarla.

      9. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      10. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

        1. *valuesArray*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*values*) olsun.
        
        2. ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Resolve]]*, `undefined`, « *valuesArray* ») döndür.
      11. undefined döndür.

    7. onFulfilled, CreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») olsun.

    8. onFulfilled.[[AlreadyCalled]] değerini alreadyCalled olarak ayarla.

    9. onFulfilled.[[Index]] değerini index olarak ayarla.

    10. rejectedSteps, (error) parametrelerine sahip, values, resultCapability ve remainingElementsCount değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

      2. Eğer activeFunc.[[AlreadyCalled]].[[Value]] true ise, undefined döndür.

      3. activeFunc.[[AlreadyCalled]].[[Value]] değerini true olarak ayarla.

      4. obj, OrdinaryObjectCreate(%Object.prototype%) olsun.

      5. ! CreateDataPropertyOrThrow(obj, "status", "rejected") işlemini gerçekleştir.

      6. ! CreateDataPropertyOrThrow(obj, "reason", error) işlemini gerçekleştir.

      7. thisIndex, activeFunc.[[Index]] olsun.

      8. values[thisIndex] değerini obj olarak ayarla.

      9. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      10. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

        1. *valuesArray*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*values*) olsun.
        
        2. ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Resolve]]*, `undefined`, « *valuesArray* ») döndür.
      11. undefined döndür.

    11. onRejected, CreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») olsun.

    12. onRejected.[[AlreadyCalled]] değerini alreadyCalled olarak ayarla.

    13. onRejected.[[Index]] değerini index olarak ayarla.

    14. index değerini index + 1 olarak ayarla.

    15. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] + 1 olarak ayarla.

    16. ? Invoke(nextPromise, "then", « onFulfilled, onRejected ») işlemini gerçekleştir.

27.2.4.3 Promise.any ( iterable )

Bu fonksiyon, geçirilen promise'lerden ilk yerine getirilen (fulfilled) promise'in yerine getirme değeriyle yerine getirilen yeni bir promise döndürür veya geçirilen promise'lerin tümü reddedilirse reddedilme gerekçelerini içeren bir AggregateError ile reddeder. Bu algoritmayı çalıştırırken geçirilen yinelenebilir (iterable) nesnenin tüm elemanlarını promise olarak çözümler.

  1. ctor, this değeri olsun.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. promiseResolve, Completion(GetPromiseResolve(ctor)) olsun.

  4. IfAbruptRejectPromise(promiseResolve, promiseCapability) işlemini gerçekleştir.

  5. iteratorRecord, Completion(GetIterator(iterable, sync)) olsun.

  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability) işlemini gerçekleştir.

  7. result, Completion(PerformPromiseAny(iteratorRecord, ctor, promiseCapability, promiseResolve)) olsun.

  8. Eğer result bir ani tamamlanma (abrupt completion) ise, o zaman

    1. Eğer iteratorRecord.[[Done]] false ise, result değerini Completion(IteratorClose(iteratorRecord, result)) olarak güncelle.

    2. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  9. ! result döndür.

27.2.4.3.1 PerformPromiseAny ( iteratorRecord, ctor, resultCapability, promiseResolve )

PerformPromiseAny soyut işlemi; iteratorRecord (bir Yineleyici Kaydı), ctor (bir yapıcı), resultCapability (bir PromiseCapability Kaydı) ve promiseResolve (bir fonksiyon nesnesi) argümanlarını alır ve bir Nesne içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. errors, yeni ve boş bir Liste (List) olsun.

  2. NOTE: remainingElementsCount, girdi yineleyicisi (iterator) tükenmeden önce geçirilen geri çağırmayı çağıran hatalı çalışan bir "then" durumunda bile, resultCapability.[[Reject]] metodunun yalnızca bir kez çağrılmasını sağlamak amacıyla 0 yerine 1'den başlar.

  3. remainingElementsCount, { [[Value]]: 1 } Kaydı (Record) olsun.

  4. index, 0 olsun.

  5. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, o zaman

      1. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      2. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

         1. *aggregateError*, yeni oluşturulmuş bir `AggregateError` nesnesi olsun.
        
         2. ! [DefinePropertyOrThrow](08_sec-abstract-operations.md#sec-definepropertyorthrow)(*aggregateError*, `"errors"`, PropertyDescriptor { *[[Configurable]]*: `true`, *[[Enumerable]]*: `false`, *[[Writable]]*: `true`, *[[Value]]*: [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*errors*) }) işlemini gerçekleştir.
        
         3. ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Reject]]*, `undefined`, « *aggregateError* ») işlemini gerçekleştir.
      3. resultCapability.[[Promise]] döndür.

    3. errors listesine undefined ekle.

    4. nextPromise, ? Call(promiseResolve, ctor, « next ») olsun.

    5. rejectedSteps, (error) parametrelerine sahip, errors, resultCapability ve remainingElementsCount değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

      2. Eğer activeFunc.[[AlreadyCalled]] true ise, undefined döndür.

      3. activeFunc.[[AlreadyCalled]] değerini true olarak ayarla.

      4. thisIndex, activeFunc.[[Index]] olsun.

      5. errors[thisIndex] değerini error olarak ayarla.

      6. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] - 1 olarak ayarla.

      7. Eğer remainingElementsCount.[[Value]] = 0 ise, o zaman

         1. *aggregateError*, yeni oluşturulmuş bir `AggregateError` nesnesi olsun.
        
         2. ! [DefinePropertyOrThrow](08_sec-abstract-operations.md#sec-definepropertyorthrow)(*aggregateError*, `"errors"`, PropertyDescriptor { *[[Configurable]]*: `true`, *[[Enumerable]]*: `false`, *[[Writable]]*: `true`, *[[Value]]*: [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(*errors*) }) işlemini gerçekleştir.
        
         3. Return ? [Call](08_sec-abstract-operations.md#sec-call)(*resultCapability*.*[[Reject]]*, `undefined`, « *aggregateError* »).
      8. undefined döndür.

    6. onRejected, CreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») olsun.

    7. onRejected.[[AlreadyCalled]] değerini false olarak ayarla.

    8. onRejected.[[Index]] değerini index olarak ayarla.

    9. index değerini index + 1 olarak ayarla.

    10. remainingElementsCount.[[Value]] değerini remainingElementsCount.[[Value]] + 1 olarak ayarla.

    11. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») işlemini gerçekleştir.

27.2.4.4 Promise.prototype

Promise.prototype özelliğinin ilk değeri Promise prototip nesnesidir (Promise prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.2.4.5 Promise.race ( iterable )

Bu fonksiyon, karara bağlanan (settled) ilk promise ile aynı şekilde karara bağlanan yeni bir promise döndürür. Bu algoritmayı çalıştırırken geçirilen iterable nesnenin tüm elemanlarını promise olarak çözümler.

  1. ctor, this değeri olsun.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. promiseResolve, Completion(GetPromiseResolve(ctor)) olsun.

  4. IfAbruptRejectPromise(promiseResolve, promiseCapability) işlemini gerçekleştir.

  5. iteratorRecord, Completion(GetIterator(iterable, sync)) olsun.

  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability) işlemini gerçekleştir.

  7. result, Completion(PerformPromiseRace(iteratorRecord, ctor, promiseCapability, promiseResolve)) olsun.

  8. Eğer result bir ani tamamlanma (abrupt completion) ise, o zaman

    1. Eğer iteratorRecord.[[Done]] false ise, result değerini Completion(IteratorClose(iteratorRecord, result)) olarak güncelle.

    2. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  9. ! result döndür.

27.2.4.5.1 PerformPromiseRace ( iteratorRecord, ctor, resultCapability, promiseResolve )

PerformPromiseRace soyut işlemi; iteratorRecord (bir Yineleyici Kaydı), ctor (bir yapıcı), resultCapability (bir PromiseCapability Kaydı) ve promiseResolve (bir fonksiyon nesnesi) argümanlarını alır ve bir Nesne içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, o zaman

      1. resultCapability.[[Promise]] döndür.
    3. nextPromise, ? Call(promiseResolve, ctor, « next ») olsun.

    4. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») işlemini gerçekleştir.

27.2.4.6 Promise.reject ( reason )

Bu fonksiyon, geçirilen argümanla reddedilmiş yeni bir promise döndürür.

  1. ctor, this değeri olsun.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. ? Call(promiseCapability.[[Reject]], undefined, « reason ») işlemini gerçekleştir.

  4. promiseCapability.[[Promise]] döndür.

27.2.4.7 Promise.resolve ( resolution )

Bu fonksiyon, geçirilen argümanla çözümlenmiş yeni bir promise döndürür; veya eğer argüman bu yapıcı (constructor) tarafından üretilmiş bir promise ise argümanın kendisini döndürür.

  1. ctor, this değeri olsun.

  2. Eğer ctor bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. Dönüş değeri: ? PromiseResolve(ctor, resolution).

27.2.4.7.1 PromiseResolve ( ctor, resolution )

PromiseResolve soyut işlemi; ctor (bir Nesne) ve resolution (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve bir Nesne içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. resolution ile çözümlenmiş yeni bir promise döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsPromise(resolution) true ise, o zaman

    1. resolutionCtor, ? Get(resolution, "constructor") olsun.

    2. Eğer SameValue(resolutionCtor, ctor) true ise, resolution döndür.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. ? Call(promiseCapability.[[Resolve]], undefined, « resolution ») işlemini gerçekleştir.

  4. promiseCapability.[[Promise]] döndür.

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

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ctor, this değeri olsun.

  2. Eğer ctor bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  4. status, Completion(Call(callback, undefined, args)) olsun.

  5. Eğer status bir ani tamamlanma (abrupt completion) ise, o zaman

    1. ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») işlemini gerçekleştir.
  6. Değilse,

    1. ? Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] ») işlemini gerçekleştir.
  7. promiseCapability.[[Promise]] döndür.

27.2.4.9 Promise.withResolvers ( )

Bu fonksiyon üç özelliğe sahip bir nesne döndürür: yeni bir promise ve bununla ilişkili resolve ve reject fonksiyonları.

  1. ctor, this değeri olsun.

  2. promiseCapability, ? NewPromiseCapability(ctor) olsun.

  3. obj, OrdinaryObjectCreate(%Object.prototype%) olsun.

  4. ! CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]]) işlemini gerçekleştir.

  5. ! CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]]) işlemini gerçekleştir.

  6. ! CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]]) işlemini gerçekleştir.

  7. obj döndür.

27.2.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%] set erişici fonksiyonu undefined olan bir erişici özelliktir (accessor property). Get erişici fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin değeri "get [Symbol.species]" şeklindedir.

27.2.5 Properties of the Promise Prototype Object

Promise prototip nesnesi:

27.2.5.1 Promise.prototype.catch ( onRejected )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. promise, this değeri olsun.

  2. Dönüş değeri: ? Invoke(promise, "then", « undefined, onRejected »).

27.2.5.2 Promise.prototype.constructor

Promise.prototype.constructor özelliğinin ilk değeri %Promise% nesnesidir.

27.2.5.3 Promise.prototype.finally ( onFinally )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. promise, this değeri olsun.

  2. Eğer promise bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  3. ctor, ? SpeciesConstructor(promise, %Promise%) olsun.

  4. Assert: IsConstructor(ctor) true'dur.

  5. Eğer IsCallable(onFinally) false ise, o zaman

    1. thenFinally, onFinally olsun.

    2. catchFinally, onFinally olsun.

  6. Değilse,

    1. thenFinallyClosure, (value) parametrelerine sahip, onFinally ve ctor değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. result, ? Call(onFinally, undefined) olsun.

      2. p, ? PromiseResolve(ctor, result) olsun.

      3. returnValue, hiçbir parametre almayan, value değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

         1. [NormalCompletion](07_sec-ecmascript-data-types-and-values.md#sec-normalcompletion)(*value*) döndür.
      4. valueThunk, CreateBuiltinFunction(returnValue, 0, "", « ») olsun.

      5. ? Invoke(p, "then", « valueThunk ») döndür.

    2. thenFinally, CreateBuiltinFunction(thenFinallyClosure, 1, "", « ») olsun.

    3. catchFinallyClosure, (reason) parametrelerine sahip, onFinally ve ctor değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

      1. result, ? Call(onFinally, undefined) olsun.

      2. p, ? PromiseResolve(ctor, result) olsun.

      3. throwReason, hiçbir parametre almayan, reason değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

         1. *reason* fırlat.
      4. thrower, CreateBuiltinFunction(throwReason, 0, "", « ») olsun.

      5. ? Invoke(p, "then", « thrower ») döndür.

    4. catchFinally, CreateBuiltinFunction(catchFinallyClosure, 1, "", « ») olsun.

  7. ? Invoke(promise, "then", « thenFinally, catchFinally ») döndür.

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. promise, this değeri olsun.

  2. Eğer IsPromise(promise) false ise, bir TypeError istisnası fırlat.

  3. ctor, ? SpeciesConstructor(promise, %Promise%) olsun.

  4. resultCapability, ? NewPromiseCapability(ctor) olsun.

  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability) döndür.

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

PerformPromiseThen soyut işlemi; promise (bir Promise), onFulfilled (bir ECMAScript dil değeri (ECMAScript language value)) ve onRejected (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını ve isteğe bağlı resultCapability (bir PromiseCapability Kaydı) argümanını alır ve bir Nesne ya da undefined döndürür. Çözümleme eylemleri olarak onFulfilled ve onRejected fonksiyonlarını kullanarak promise üzerinde "then" işlemini gerçekleştirir. Eğer resultCapability geçirilirse, sonuç resultCapability'nin promise'i güncellenerek depolanır. Eğer geçirilmemişse, PerformPromiseThen sonucun önemli olmadığı bir şartname-içi (specification-internal) işlem tarafından çağrılıyor demektir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsPromise(promise) true'dur.

  2. Eğer resultCapability mevcut değilse, o zaman

    1. resultCapability değerini undefined olarak ayarla.
  3. Eğer IsCallable(onFulfilled) false ise, o zaman

    1. onFulfilledJobCallback, empty olsun.
  4. Değilse,

    1. onFulfilledJobCallback, HostMakeJobCallback(onFulfilled) olsun.
  5. Eğer IsCallable(onRejected) false ise, o zaman

    1. onRejectedJobCallback, empty olsun.
  6. Değilse,

    1. onRejectedJobCallback, HostMakeJobCallback(onRejected) olsun.
  7. fulfillReaction, { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback } PromiseReaction Kaydı olsun.

  8. rejectReaction, { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback } PromiseReaction Kaydı olsun.

  9. Eğer promise.[[PromiseState]] pending ise, o zaman

    1. promise.[[PromiseFulfillReactions]] listesine fulfillReaction ekle.

    2. promise.[[PromiseRejectReactions]] listesine rejectReaction ekle.

  10. Else if promise.[[PromiseState]] fulfilled ise, o zaman

    1. value, promise.[[PromiseResult]] olsun.

    2. fulfillJob, NewPromiseReactionJob(fulfillReaction, value) olsun.

    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) işlemini gerçekleştir.

  11. Değilse,

    1. Assert: promise.[[PromiseState]] değeri rejected'dır.

    2. reason, promise.[[PromiseResult]] olsun.

    3. Eğer promise.[[PromiseIsHandled]] false ise, HostPromiseRejectionTracker(promise, "handle") işlemini gerçekleştir.

    4. rejectJob, NewPromiseReactionJob(rejectReaction, reason) olsun.

    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) işlemini gerçekleştir.

  12. promise.[[PromiseIsHandled]] değerini true olarak ayarla.

  13. Eğer resultCapability undefined ise, undefined döndür.

  14. resultCapability.[[Promise]] döndür.

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri "Promise" dizesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.2.6 Properties of Promise Instances

Promise örnekleri, Promise prototip nesnesinden (Promise prototype object) (yani içsel %Promise.prototype% nesnesinden) özellikler miras alan sıradan nesnelerdir (ordinary objects). Promise örnekleri başlangıçta Tablo 88 içinde açıklanan dahili yuvalarla oluşturulur.

Tablo 88: Promise Örneklerinin Dahili Yuvaları

Dahili Yuva Tür Açıklama
[[PromiseState]] pending, fulfilled veya rejected Bir promise nesnesinin kendi then metoduna gelen çağrılara nasıl tepki vereceğini yönetir.
[[PromiseResult]] bir ECMAScript dil değeri (ECMAScript language value) veya empty Varsa promise'in yerine getirildiği (fulfilled) veya reddedildiği (rejected) değer. Yalnızca [[PromiseState]] değeri pending ise empty olur.
[[PromiseFulfillReactions]] PromiseReaction Kayıtlarının bir Listesi (List) Promise nesnesi pending durumundan fulfilled durumuna geçtiğinde işlenecek Kayıtlar (Records).
[[PromiseRejectReactions]] PromiseReaction Kayıtlarının bir Listesi (List) Promise nesnesi pending durumundan rejected durumuna geçtiğinde işlenecek Kayıtlar (Records).
[[PromiseIsHandled]] bir Boolean Promise nesnesine daha önce herhangi bir yerine getirme veya reddetme işleyicisi eklenip eklenmediğini belirtir; işlenmemiş reddetme izlemesinde kullanılır.

27.3 GeneratorFunction Nesneleri (GeneratorFunction Objects)

GeneratorFunction nesneleri, genellikle GeneratorDeclaration, GeneratorExpression ve GeneratorMethod ifadelerinin değerlendirilmesiyle oluşturulan fonksiyonlardır. Ayrıca %GeneratorFunction% içsel nesnesi çağrılarak da oluşturulabilirler.

Şekil 6 (Bilgilendirici): Generator Nesneleri İlişkileri

27.3.1 GeneratorFunction Yapıcısı (The GeneratorFunction Constructor)

GeneratorFunction yapıcısı (constructor):

  • %GeneratorFunction% nesnesidir.

  • Function yapıcısının bir alt sınıfıdır.

  • bir yapıcı olarak değil de bir fonksiyon olarak çağrıldığında yeni bir GeneratorFunction oluşturur ve başlatır. Bu nedenle, GeneratorFunction (...) fonksiyon çağrısı, aynı argümanlarla yapılan new GeneratorFunction (...) nesne oluşturma ifadesiyle eş değerdir.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen GeneratorFunction davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors), yerleşik GeneratorFunction davranışı için gerekli dahili yuvalara sahip alt sınıf örneklerini oluşturmak ve başlatmak için GeneratorFunction yapıcısına (constructor) bir super çağrısı içermelidir. Jeneratör fonksiyon nesnelerini (function objects) tanımlamaya yönelik tüm ECMAScript sözdizimsel biçimleri, doğrudan GeneratorFunction örnekleri oluşturur. GeneratorFunction alt sınıflarının örneklerini oluşturmak için sözdizimsel bir yol yoktur.

27.3.1.1 GeneratorFunction ( ...paramArgs, bodyArg )

Son argüman (eğer varsa) bir jeneratör fonksiyonunun gövdesini (yürütülebilir kod) belirtir; önceki tüm argümanlar formal parametreleri belirtir.

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

  2. Eğer bodyArg mevcut değilse, bodyArg değerini boş Dize olarak ayarla.

  3. Dönüş değeri: ? CreateDynamicFunction(activeFunc, NewTarget, generator, paramArgs, bodyArg).

27.3.2 GeneratorFunction Yapıcısının Özellikleri (Properties of the GeneratorFunction Constructor)

GeneratorFunction yapıcısı (constructor):

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype özelliğinin ilk değeri GeneratorFunction prototip nesnesidir (GeneratorFunction prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.3.3 GeneratorFunction Prototip Nesnesinin Özellikleri (Properties of the GeneratorFunction Prototype Object)

GeneratorFunction prototip nesnesi:

27.3.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor özelliğinin ilk değeri %GeneratorFunction% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.3.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype özelliğinin ilk değeri %GeneratorPrototype% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri "GeneratorFunction" dizesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.3.4 GeneratorFunction Örnekleri (GeneratorFunction Instances)

Her GeneratorFunction örneği bir ECMAScript fonksiyon nesnesidir (function object) ve Tablo 25 içinde listelenen dahili yuvalara sahiptir. Bu tür tüm örnekler için [[IsClassConstructor]] dahili yuvasının değeri false'dur.

Her GeneratorFunction örneği aşağıdaki kendi özelliklerine (own properties) sahiptir:

27.3.4.1 length

20.2.4.1 içinde Function örneklerinin "length" özelliği için verilen şartname, GeneratorFunction örnekleri için de geçerlidir.

27.3.4.2 name

20.2.4.2 içinde Function örneklerinin "name" özelliği için verilen şartname, GeneratorFunction örnekleri için de geçerlidir.

27.3.4.3 prototype

Bir GeneratorFunction örneği oluşturulduğunda başka bir sıradan nesne (ordinary object) de oluşturulur ve bu nesne, jeneratör fonksiyonunun "prototype" özelliğinin ilk değeridir. prototype özelliğinin değeri, jeneratör fonksiyon nesnesi (function object) [[Call]] kullanılarak çağrıldığında yeni oluşturulan bir Generator'ın [[Prototype]] dahili yuvasını başlatmak için kullanılır.

Bu özellik { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.4 AsyncGeneratorFunction Nesneleri (AsyncGeneratorFunction Objects)

AsyncGeneratorFunction nesneleri, genellikle AsyncGeneratorDeclaration, AsyncGeneratorExpression ve AsyncGeneratorMethod sözdizimsel üretimlerinin değerlendirilmesiyle oluşturulan fonksiyonlardır. Ayrıca %AsyncGeneratorFunction% içsel nesnesi çağrılarak da oluşturulabilirler.

27.4.1 AsyncGeneratorFunction Yapıcısı (The AsyncGeneratorFunction Constructor)

AsyncGeneratorFunction yapıcısı (constructor):

  • %AsyncGeneratorFunction% nesnesidir.

  • Function yapıcısının bir alt sınıfıdır.

  • bir yapıcı olarak değil de bir fonksiyon olarak çağrıldığında yeni bir AsyncGeneratorFunction oluşturur ve başlatır. Bu nedenle, AsyncGeneratorFunction (...) fonksiyon çağrısı, aynı argümanlarla yapılan new AsyncGeneratorFunction (...) nesne oluşturma ifadesiyle eş değerdir.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen AsyncGeneratorFunction davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors), yerleşik AsyncGeneratorFunction davranışı için gerekli dahili yuvalara sahip alt sınıf örneklerini oluşturmak ve başlatmak için AsyncGeneratorFunction yapıcısına (constructor) bir super çağrısı içermelidir. Asenkron jeneratör fonksiyon nesnelerini (function objects) tanımlamaya yönelik tüm ECMAScript sözdizimsel biçimleri, doğrudan AsyncGeneratorFunction örnekleri oluşturur. AsyncGeneratorFunction alt sınıflarının örneklerini oluşturmak için sözdizimsel bir yol yoktur.

27.4.1.1 AsyncGeneratorFunction ( ...paramArgs, bodyArg )

Son argüman (eğer varsa) bir asenkron jeneratör fonksiyonunun gövdesini (yürütülebilir kod) belirtir; önceki tüm argümanlar formal parametreleri belirtir.

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

  2. Eğer bodyArg mevcut değilse, bodyArg değerini boş Dize olarak ayarla.

  3. Dönüş değeri: ? CreateDynamicFunction(activeFunc, NewTarget, async-generator, paramArgs, bodyArg).

27.4.2 AsyncGeneratorFunction Yapıcısının Özellikleri (Properties of the AsyncGeneratorFunction Constructor)

AsyncGeneratorFunction yapıcısı (constructor):

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype özelliğinin ilk değeri AsyncGeneratorFunction prototip nesnesidir (AsyncGeneratorFunction prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.4.3 AsyncGeneratorFunction Prototip Nesnesinin Özellikleri (Properties of the AsyncGeneratorFunction Prototype Object)

AsyncGeneratorFunction prototip nesnesi:

27.4.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor özelliğinin ilk değeri %AsyncGeneratorFunction% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.4.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype özelliğinin ilk değeri %AsyncGeneratorPrototype% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri "AsyncGeneratorFunction" dizesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.4.4 AsyncGeneratorFunction Örnekleri (AsyncGeneratorFunction Instances)

Her AsyncGeneratorFunction örneği bir ECMAScript fonksiyon nesnesidir (function object) ve Tablo 25 içinde listelenen dahili yuvalara sahiptir. Bu tür tüm örnekler için [[IsClassConstructor]] dahili yuvasının değeri false'dur.

Her AsyncGeneratorFunction örneği aşağıdaki kendi özelliklerine (own properties) sahiptir:

27.4.4.1 length

"length" özelliğinin değeri, AsyncGeneratorFunction tarafından beklenen tipik argüman sayısını belirten bir tamsayı Sayıdır (integral Number). Ancak dil, fonksiyonun başka sayıda argümanla çağrılmasına izin verir. Bir AsyncGeneratorFunction nesnesinin "length" özelliği tarafından belirtilen sayıdan farklı sayıda argümanla çağrıldığındaki davranışı fonksiyona bağlıdır.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.4.4.2 name

20.2.4.2 içinde Function örneklerinin "name" özelliği için verilen şartname, AsyncGeneratorFunction örnekleri için de geçerlidir.

27.4.4.3 prototype

Bir AsyncGeneratorFunction örneği oluşturulduğunda başka bir sıradan nesne (ordinary object) de oluşturulur ve bu nesne, asenkron jeneratör fonksiyonunun "prototype" özelliğinin ilk değeridir. prototype özelliğinin değeri, jeneratör fonksiyon nesnesi (function object) [[Call]] kullanılarak çağrıldığında yeni oluşturulan bir AsyncGenerator'ın [[Prototype]] dahili yuvasını başlatmak için kullanılır.

Bu özellik { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.5 Generator Nesneleri (Generator Objects)

Bir Generator, bir jeneratör fonksiyonu çağrılarak oluşturulur ve hem yineleyici arayüzüne (iterator interface) hem de yinelenebilir arayüze (iterable interface) uygundur.

Generator örnekleri, kendilerini oluşturan jeneratör fonksiyonunun "prototype" özelliğinin ilk değerinden doğrudan özellikler miras alır. Generator örnekleri dolaylı olarak %GeneratorPrototype% nesnesinden özellikler miras alır.

27.5.1 %GeneratorPrototype% Nesnesi (The %GeneratorPrototype% Object)

%GeneratorPrototype% nesnesi:

  • %GeneratorFunction.prototype.prototype% nesnesidir.

  • bir sıradan nesnedir (ordinary object).

  • bir Generator örneği değildir ve bir [[GeneratorState]] dahili yuvasına sahip değildir.

  • değeri %Iterator.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • tüm Generator örnekleri tarafından dolaylı olarak miras alınan özelliklere sahiptir.

27.5.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor özelliğinin ilk değeri %GeneratorFunction.prototype% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.5.1.2 %GeneratorPrototype%.next ( value )

  1. ? GeneratorResume(this değeri, value, empty) döndür.

27.5.1.3 %GeneratorPrototype%.return ( value )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. gen, this değeri olsun.

  2. completion, ReturnCompletion(value) olsun.

  3. ? GeneratorResumeAbrupt(gen, completion, empty) döndür.

27.5.1.4 %GeneratorPrototype%.throw ( exception )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. gen, this değeri olsun.

  2. completion, ThrowCompletion(exception) olsun.

  3. ? GeneratorResumeAbrupt(gen, completion, empty) döndür.

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri "Generator" dizesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.5.2 Generator Örneklerinin Özellikleri (Properties of Generator Instances)

Generator örnekleri başlangıçta Tablo 89 içinde açıklanan dahili yuvalarla oluşturulur.

Tablo 89: Generator Örneklerinin Dahili Yuvaları

Dahili Yuva Tür Açıklama
[[GeneratorState]] suspended-start, suspended-yield, executing veya completed Jeneratörün mevcut yürütme durumu.
[[GeneratorContext]] bir yürütme bağlamı (execution context) Bu jeneratörın kodunu yürütürken kullanılan yürütme bağlamı (execution context).
[[GeneratorBrand]] bir Dize veya empty Farklı jeneratör türlerini ayırt etmek için kullanılan bir marka. ECMAScript kaynak metni (ECMAScript source text) tarafından bildirilen jeneratörlerin [[GeneratorBrand]] değeri her zaman empty'dir.

27.5.3 Generator Soyut İşlemleri (Generator Abstract Operations)

27.5.3.1 GeneratorStart ( gen, genBody )

GeneratorStart soyut işlemi; gen (bir Generator) ve genBody (parametresiz bir FunctionBody Ayrıştırma Düğümü (Parse Node) veya [Soyut Kapanış (Abstract Closure)]) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: gen.[[GeneratorState]] değeri suspended-start'tır.

  2. genContext, çalışan yürütme bağlamı (running execution context) olsun.

  3. genContext nesnesinin Generator bileşenini gen olarak ayarla.

  4. closure, genBody değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. acGenContext, çalışan yürütme bağlamı (running execution context) olsun.

    2. acGen, acGenContext nesnesinin Generator bileşeni olsun.

    3. Eğer genBody bir Ayrıştırma Düğümü (Parse Node) ise, o zaman

      1. result, Completion(genBody için Değerlendirme (Evaluation)) olsun.
    4. Değilse,

      1. Assert: genBody parametresiz bir Soyut Kapanış (Abstract Closure)'tır.

      2. result, Completion(genBody()) olsun.

    5. Assert: Buraya geri dönülürse, jeneratör ya bir istisna fırlatmıştır ya da örtük veya açık bir geri dönüş gerçekleştirmiştir.

    6. acGenContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve yürütme bağlamı yığınının (execution context stack) tepesinde bulunan yürütme bağlamını (execution context) çalışan yürütme bağlamı (running execution context) olarak geri yükle.

    7. acGen.[[GeneratorState]] değerini completed olarak ayarla.

    8. NOTE: Bir jeneratör completed durumuna girdikten sonra bu durumdan asla çıkmaz ve onunla ilişkili yürütme bağlamı (execution context) hiçbir zaman yeniden başlatılmaz. acGen ile ilişkili herhangi bir yürütme durumu bu noktada atılabilir.

    9. Eğer result bir olağan tamamlanma (normal completion) ise, o zaman

      1. resultValue, undefined olsun.
    10. Else if result bir dönüş tamamlanması (return completion) ise, o zaman

      1. resultValue, result.[[Value]] olsun.
    11. Değilse,

      1. Assert: result bir fırlatma tamamlanması (throw completion)'tır.

      2. ? result döndür.

    12. NormalCompletion(CreateIteratorResultObject(resultValue, true)) döndür.

  5. genContext bağlamının kod değerlendirme durumunu, o yürütme bağlamı (execution context) için değerlendirme yeniden başlatıldığında, closure parametresiz olarak çağrılacak şekilde ayarla.

  6. gen.[[GeneratorContext]] değerini genContext olarak ayarla.

  7. unused döndür.

27.5.3.2 GeneratorValidate ( gen, genBrand )

GeneratorValidate soyut işlemi; gen (bir ECMAScript dil değeri (ECMAScript language value)) ve genBrand (bir Dize veya empty) argümanlarını alır ve suspended-start, suspended-yield veya completed değerlerinden birini içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? RequireInternalSlot(gen, [[GeneratorState]]) işlemini gerçekleştir.

  2. ? RequireInternalSlot(gen, [[GeneratorBrand]]) işlemini gerçekleştir.

  3. Eğer gen.[[GeneratorBrand]] değeri genBrand değilse, bir TypeError istisnası fırlat.

  4. Assert: gen, bir [[GeneratorContext]] dahili yuvasına sahiptir.

  5. state, gen.[[GeneratorState]] olsun.

  6. Eğer state executing ise, bir TypeError istisnası fırlat.

  7. state döndür.

27.5.3.3 GeneratorResume ( gen, value, genBrand )

GeneratorResume soyut işlemi; gen (bir ECMAScript dil değeri (ECMAScript language value)), value (bir ECMAScript dil değeri (ECMAScript language value) veya empty) ve genBrand (bir Dize veya empty) argümanlarını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. state, ? GeneratorValidate(gen, genBrand) olsun.

  2. Eğer state completed ise, CreateIteratorResultObject(undefined, true) döndür.

  3. Assert: state değeri ya suspended-start ya da suspended-yield'dır.

  4. genContext, gen.[[GeneratorContext]] olsun.

  5. gen.[[GeneratorState]] değerini executing olarak ayarla.

  6. Dönüş değeri: ? RunSuspendedContext(genContext, NormalCompletion(value)).

27.5.3.4 GeneratorResumeAbrupt ( gen, abruptCompletion, genBrand )

GeneratorResumeAbrupt soyut işlemi; gen (bir ECMAScript dil değeri (ECMAScript language value)), abruptCompletion (bir dönüş tamamlanması veya bir fırlatma tamamlanması) ve genBrand (bir Dize veya empty) argümanlarını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. state, ? GeneratorValidate(gen, genBrand) olsun.

  2. Eğer state suspended-start ise, o zaman

    1. gen.[[GeneratorState]] değerini completed olarak ayarla.

    2. NOTE: Bir jeneratör completed durumuna girdikten sonra bu durumdan asla çıkmaz ve onunla ilişkili yürütme bağlamı (execution context) hiçbir zaman yeniden başlatılmaz. gen ile ilişkili any yürütme durumu bu noktada atılabilir.

    3. state değerini completed olarak ayarla.

  3. Eğer state completed ise, o zaman

    1. Eğer abruptCompletion bir dönüş tamamlanması (return completion) ise, o zaman

      1. Return CreateIteratorResultObject(abruptCompletion.[[Value]], true).
    2. ? abruptCompletion döndür.

  4. Assert: state değeri suspended-yield'dır.

  5. genContext, gen.[[GeneratorContext]] olsun.

  6. gen.[[GeneratorState]] değerini executing olarak ayarla.

  7. Dönüş değeri: ? RunSuspendedContext(genContext, abruptCompletion).

27.5.3.5 GetGeneratorKind ( )

GetGeneratorKind soyut işlemi hiçbir argüman almaz ve non-generator, sync veya async döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. genContext, çalışan yürütme bağlamı (running execution context) olsun.

  2. Eğer genContext bir Generator bileşenine sahip değilse, non-generator döndür.

  3. gen, genContext nesnesinin Generator bileşeni olsun.

  4. Eğer gen bir [[AsyncGeneratorState]] dahili yuvasına sahipse, async döndür.

  5. sync döndür.

27.5.3.6 GeneratorYield ( iteratorResult )

GeneratorYield soyut işlemi; iteratorResult (bir IteratorResult arayüzüne uyan bir Nesne) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir ani tamamlanma (abrupt completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. genContext, çalışan yürütme bağlamı (running execution context) olsun.

  2. Assert: genContext, bir jeneratörün yürütme bağlamıdır (execution context).

  3. gen, genContext nesnesinin Generator bileşeninin değeri olsun.

  4. Assert: GetGeneratorKind() değeri sync'dir.

  5. gen.[[GeneratorState]] değerini suspended-yield olarak ayarla.

  6. genContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve yürütme bağlamı yığınının (execution context stack) tepesinde bulunan yürütme bağlamını (execution context) çalışan yürütme bağlamı (running execution context) olarak geri yükle.

  7. callerContext, çalışan yürütme bağlamı (running execution context) olsun.

  8. NormalCompletion(iteratorResult) geçirerek callerContext bağlamını yeniden başlat. Eğer genContext daha sonra tekrar yeniden başlatılırsa, resumptionValue, yeniden başlatıldığı Tamamlanma Kaydı (Completion Record) olsun.

  9. Assert: Denetim buraya ulaşırsa, o zaman genContext yine çalışan yürütme bağlamıdır (running execution context).

  10. resumptionValue döndür.

27.5.3.7 Yield ( arg )

Yield soyut işlemi; arg (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir ani tamamlanma (abrupt completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. genKind, GetGeneratorKind() olsun.

  2. Eğer genKind async ise, ? AsyncGeneratorYield(? Await(arg)) döndür.

  3. ? GeneratorYield(CreateIteratorResultObject(arg, false)) döndür.

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

CreateIteratorFromClosure soyut işlemi; closure (parametresiz bir [Soyut Kapanış (Abstract Closure)]), genBrand (bir Dize veya empty) ve genProto (bir Nesne) argümanlarını ve isteğe bağlı extraSlots (dahili yuva adlarının bir Listesi (List)) argümanını alır ve bir Generator. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NOTE: closure, bir IteratorResult nesnesi üretmek için Yield işleminin kullanımlarını içerebilir.

  2. Eğer extraSlots mevcut değilse, extraSlots değerini yeni ve boş bir Liste (List) olarak ayarla.

  3. internalSlotsList, extraSlots ile « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » listesinin liste birleşimi (list-concatenation) olsun.

  4. gen, OrdinaryObjectCreate(genProto, internalSlotsList) olsun.

  5. gen.[[GeneratorBrand]] değerini genBrand olarak ayarla.

  6. gen.[[GeneratorState]] değerini suspended-start olarak ayarla.

  7. callerContext, çalışan yürütme bağlamı (running execution context) olsun.

  8. calleeContext, yeni bir yürütme bağlamı (execution context) olsun.

  9. calleeContext nesnesinin Function bileşenini null olarak ayarla.

  10. calleeContext nesnesinin Realm bileşenini geçerli Realm Kaydı (the current Realm Record) olarak ayarla.

  11. calleeContext nesnesinin ScriptOrModule bileşenini callerContext nesnesinin ScriptOrModule bileşeni olarak ayarla.

  12. Eğer callerContext zaten askıya alınmamışsa, callerContext bağlamını askıya al.

  13. calleeContext bağlamını yürütme bağlamı yığınına (execution context stack) it; calleeContext artık çalışan yürütme bağlamıdır (running execution context).

  14. GeneratorStart(gen, closure) işlemini gerçekleştir.

  15. calleeContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve callerContext bağlamını çalışan yürütme bağlamı (running execution context) olarak geri yükle.

  16. gen döndür.

27.6 AsyncGenerator Nesneleri (AsyncGenerator Objects)

Bir AsyncGenerator, bir asenkron jeneratör fonksiyonu çağrılarak oluşturulur ve hem asenkron yineleyici arayüzüne (async iterator interface) hem de asenkron yinelenebilir arayüze (async iterable interface) uygundur.

AsyncGenerator örnekleri, kendilerini oluşturan asenkron jeneratör fonksiyonunun "prototype" özelliğinin ilk değerinden doğrudan özellikler miras alır. AsyncGenerator örnekleri dolaylı olarak %AsyncGeneratorPrototype% nesnesinden özellikler miras alır.

27.6.1 %AsyncGeneratorPrototype% Nesnesi (The %AsyncGeneratorPrototype% Object)

%AsyncGeneratorPrototype% nesnesi:

  • %AsyncGeneratorFunction.prototype.prototype% nesnesidir.

  • bir sıradan nesnedir (ordinary object).

  • bir AsyncGenerator örneği değildir ve bir [[AsyncGeneratorState]] dahili yuvasına sahip değildir.

  • değeri %AsyncIteratorPrototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • tüm AsyncGenerator örnekleri tarafından dolaylı olarak miras alınan özelliklere sahiptir.

27.6.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor özelliğinin ilk değeri %AsyncGeneratorFunction.prototype% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.6.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. gen, this değeri olsun.

  2. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  3. result, Completion(AsyncGeneratorValidate(gen, empty)) olsun.

  4. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  5. state, gen.[[AsyncGeneratorState]] olsun.

  6. Eğer state completed ise, o zaman

    1. iteratorResult, CreateIteratorResultObject(undefined, true) olsun.

    2. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») işlemini gerçekleştir.

    3. promiseCapability.[[Promise]] döndür.

  7. completion, NormalCompletion(value) olsun.

  8. AsyncGeneratorEnqueue(gen, completion, promiseCapability) işlemini gerçekleştir.

  9. Eğer state ya suspended-start ya da suspended-yield ise, o zaman

    1. AsyncGeneratorResume(gen, completion) işlemini gerçekleştir.
  10. Değilse,

    1. Assert: state değeri ya executing ya da draining-queue'dur.
  11. promiseCapability.[[Promise]] döndür.

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. gen, this değeri olsun.

  2. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  3. result, Completion(AsyncGeneratorValidate(gen, empty)) olsun.

  4. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  5. completion, ReturnCompletion(value) olsun.

  6. AsyncGeneratorEnqueue(gen, completion, promiseCapability) işlemini gerçekleştir.

  7. state, gen.[[AsyncGeneratorState]] olsun.

  8. Eğer state ya suspended-start ya da completed ise, o zaman

    1. gen.[[AsyncGeneratorState]] değerini draining-queue olarak ayarla.

    2. AsyncGeneratorAwaitReturn(gen) işlemini gerçekleştir.

  9. Else if state suspended-yield ise, o zaman

    1. AsyncGeneratorResume(gen, completion) işlemini gerçekleştir.
  10. Değilse,

    1. Assert: state değeri ya executing ya da draining-queue'dur.
  11. promiseCapability.[[Promise]] döndür.

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. gen, this değeri olsun.

  2. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  3. result, Completion(AsyncGeneratorValidate(gen, empty)) olsun.

  4. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  5. state, gen.[[AsyncGeneratorState]] olsun.

  6. Eğer state suspended-start ise, o zaman

    1. gen.[[AsyncGeneratorState]] değerini completed olarak ayarla.

    2. state değerini completed olarak ayarla.

  7. Eğer state completed ise, o zaman

    1. ! Call(promiseCapability.[[Reject]], undefined, « exception ») işlemini gerçekleştir.

    2. promiseCapability.[[Promise]] döndür.

  8. completion, ThrowCompletion(exception) olsun.

  9. AsyncGeneratorEnqueue(gen, completion, promiseCapability) işlemini gerçekleştir.

  10. Eğer state suspended-yield ise, o zaman

    1. AsyncGeneratorResume(gen, completion) işlemini gerçekleştir.
  11. Değilse,

    1. Assert: state değeri ya executing ya da draining-queue'dur.
  12. promiseCapability.[[Promise]] döndür.

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri "AsyncGenerator" dizesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.6.2 AsyncGenerator Örneklerinin Özellikleri (Properties of AsyncGenerator Instances)

AsyncGenerator örnekleri başlangıçta aşağıda açıklanan dahili yuvalarla oluşturulur:

Tablo 90: AsyncGenerator Örneklerinin Dahili Yuvaları

Dahili Yuva Tür Açıklama
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue veya completed Asenkron jeneratörün mevcut yürütme durumu.
[[AsyncGeneratorContext]] bir yürütme bağlamı (execution context) Bu asenkron jeneratörün kodunu yürütürken kullanılan yürütme bağlamı (execution context).
[[AsyncGeneratorQueue]] AsyncGeneratorRequest Kayıtlarının bir Listesi (List) Asenkron jeneratörü yeniden başlatma isteklerini temsil eden Kayıtlar (Records). Durum geçişleri hariç olmak üzere, yalnızca ve ancak [[AsyncGeneratorState]] değeri ya executing ya da draining-queue ise boş değildir.
[[GeneratorBrand]] bir Dize veya empty Farklı asenkron jeneratör türlerini ayırt etmek için kullanılan bir marka. ECMAScript kaynak metni (ECMAScript source text) tarafından bildirilen asenkron jeneratörlerin [[GeneratorBrand]] değeri her zaman empty'dir.

27.6.3 AsyncGenerator Soyut İşlemleri (AsyncGenerator Abstract Operations)

27.6.3.1 AsyncGeneratorRequest Kayıtları (AsyncGeneratorRequest Records)

Bir AsyncGeneratorRequest, bir asenkron jeneratörün nasıl yeniden başlatılması gerektiğine dair bilgileri depolamak için kullanılan bir Kayıt (Record) değeridir ve karşılık gelen promise nesnesini yerine getirme veya reddetme yeteneklerini içerir.

Aşağıdaki alanlara sahiptirler:

Tablo 91: AsyncGeneratorRequest Kayıt (Record) Alanları

Alan Adı Değer Anlamı
[[Completion]] bir Tamamlanma Kaydı (Completion Record) Asenkron jeneratörü yeniden başlatmak için kullanılması gereken Tamamlanma Kaydı (Completion Record).
[[Capability]] bir PromiseCapability Kaydı Bu istekle ilişkili promise yetenekleri.

27.6.3.2 AsyncGeneratorStart ( gen, genBody )

AsyncGeneratorStart soyut işlemi; gen (bir AsyncGenerator) ve genBody (parametresiz bir FunctionBody Ayrıştırma Düğümü (Parse Node) veya [Soyut Kapanış (Abstract Closure)]) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: gen.[[AsyncGeneratorState]] değeri suspended-start'tır.

  2. genContext, çalışan yürütme bağlamı (running execution context) olsun.

  3. genContext nesnesinin Generator bileşenini gen olarak ayarla.

  4. closure, genBody değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. acGenContext, çalışan yürütme bağlamı (running execution context) olsun.

    2. acGen, acGenContext nesnesinin Generator bileşeni olsun.

    3. Eğer genBody bir Ayrıştırma Düğümü (Parse Node) ise, o zaman

      1. result, Completion(genBody için Değerlendirme (Evaluation)) olsun.
    4. Değilse,

      1. Assert: genBody parametresiz bir Soyut Kapanış (Abstract Closure)'tır.

      2. result, Completion(genBody()) olsun.

    5. Assert: Buraya geri dönülürse, asenkron jeneratör ya bir istisna fırlatmıştır ya da örtük veya açık bir geri dönüş gerçekleştirmiştir.

    6. acGenContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve yürütme bağlamı yığınının (execution context stack) tepesinde bulunan yürütme bağlamını (execution context) çalışan yürütme bağlamı (running execution context) olarak geri yükle.

    7. acGen.[[AsyncGeneratorState]] değerini draining-queue olarak ayarla.

    8. Eğer result bir olağan tamamlanma (normal completion) ise, result değerini NormalCompletion(undefined) olarak ayarla.

    9. Eğer result bir dönüş tamamlanması (return completion) ise, result değerini NormalCompletion(result.[[Value]]) olarak ayarla.

    10. AsyncGeneratorCompleteStep(acGen, result, true) işlemini gerçekleştir.

    11. AsyncGeneratorDrainQueue(acGen) işlemini gerçekleştir.

    12. NormalCompletion(undefined) döndür.

  5. genContext bağlamının kod değerlendirme durumunu, o yürütme bağlamı (execution context) için değerlendirme yeniden başlatıldığında, closure parametresiz olarak çağrılacak şekilde ayarla.

  6. gen.[[AsyncGeneratorContext]] değerini genContext olarak ayarla.

  7. gen.[[AsyncGeneratorQueue]] değerini yeni ve boş bir Liste (List) olarak ayarla.

  8. unused döndür.

27.6.3.3 AsyncGeneratorValidate ( gen, genBrand )

AsyncGeneratorValidate soyut işlemi; gen (bir ECMAScript dil değeri (ECMAScript language value)) ve genBrand (bir Dize veya empty) argümanlarını alır ve unused içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? RequireInternalSlot(gen, [[AsyncGeneratorContext]]) işlemini gerçekleştir.

  2. ? RequireInternalSlot(gen, [[AsyncGeneratorState]]) işlemini gerçekleştir.

  3. ? RequireInternalSlot(gen, [[AsyncGeneratorQueue]]) işlemini gerçekleştir.

  4. Eğer gen.[[GeneratorBrand]] değeri genBrand değilse, bir TypeError istisnası fırlat.

  5. unused döndür.

27.6.3.4 AsyncGeneratorEnqueue ( gen, completion, promiseCapability )

AsyncGeneratorEnqueue soyut işlemi; gen (an AsyncGenerator), completion (bir Tamamlanma Kaydı (Completion Record)) ve promiseCapability (bir PromiseCapability Kaydı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. request, { [[Completion]]: completion, [[Capability]]: promiseCapability } AsyncGeneratorRequest Kaydı olsun.

  2. request nesnesini gen.[[AsyncGeneratorQueue]] listesine ekle.

  3. unused döndür.

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

AsyncGeneratorCompleteStep soyut işlemi; gen (bir AsyncGenerator), completion (bir Tamamlanma Kaydı (Completion Record)) ve done (bir Boolean) argümanlarını ve isteğe bağlı realm (bir Realm Kaydı (Realm Record)) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: gen.[[AsyncGeneratorQueue]] boş değildir.

  2. next, gen.[[AsyncGeneratorQueue]] listesinin ilk elemanı olsun.

  3. gen.[[AsyncGeneratorQueue]] listesinden ilk elemanı çıkar.

  4. promiseCapability, next.[[Capability]] olsun.

  5. value, completion.[[Value]] olsun.

  6. Eğer completion bir fırlatma tamamlanması (throw completion) ise, o zaman

    1. ! Call(promiseCapability.[[Reject]], undefined, « value ») işlemini gerçekleştir.
  7. Değilse,

    1. Assert: completion bir olağan tamamlanmadır (normal completion).

    2. Eğer realm mevcut ise, o zaman

      1. oldRealm, çalışan yürütme bağlamının (running execution context) Realm bileşeni olsun.

      2. çalışan yürütme bağlamının (running execution context) Realm bileşenini realm olarak ayarla.

      3. iteratorResult, CreateIteratorResultObject(value, done) olsun.

      4. çalışan yürütme bağlamının (running execution context) Realm bileşenini oldRealm olarak ayarla.

    3. Değilse,

      1. iteratorResult, CreateIteratorResultObject(value, done) olsun.
    4. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») işlemini gerçekleştir.

  8. unused döndür.

27.6.3.6 AsyncGeneratorResume ( gen, completion )

AsyncGeneratorResume soyut işlemi; gen (bir AsyncGenerator) ve completion (bir Tamamlanma Kaydı (Completion Record)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: gen.[[AsyncGeneratorState]] değeri ya suspended-start ya da suspended-yield'dır.

  2. genContext, gen.[[AsyncGeneratorContext]] olsun.

  3. gen.[[AsyncGeneratorState]] değerini executing olarak ayarla.

  4. ! RunSuspendedContext(genContext, completion) işlemini gerçekleştir.

  5. unused döndür.

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

AsyncGeneratorUnwrapYieldResumption soyut işlemi; resumptionValue (bir Tamamlanma Kaydı (Completion Record)) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir ani tamamlanma (abrupt completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer resumptionValue bir dönüş tamamlanması (return completion) değilse, ? resumptionValue döndür.

  2. awaited, Completion(Await(resumptionValue.[[Value]])) olsun.

  3. Eğer awaited bir fırlatma tamamlanması (throw completion) ise, ? awaited döndür.

  4. Assert: awaited bir olağan tamamlanmadır (normal completion).

  5. ReturnCompletion(awaited.[[Value]]) döndür.

27.6.3.8 AsyncGeneratorYield ( arg )

AsyncGeneratorYield soyut işlemi; arg (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir ani tamamlanma (abrupt completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. genContext, çalışan yürütme bağlamı (running execution context) olsun.

  2. Assert: genContext, bir jeneratörün yürütme bağlamıdır (execution context).

  3. gen, genContext nesnesinin Generator bileşeninin değeri olsun.

  4. Assert: GetGeneratorKind() değeri async'dir.

  5. completion, NormalCompletion(arg) olsun.

  6. Assert: yürütme bağlamı yığınının (execution context stack) en az iki elemanı vardır.

  7. previousContext, yürütme bağlamı yığınının (execution context stack) sondan ikinci elemanı olsun.

  8. previousRealm, previousContext nesnesinin Realm bileşeni olsun.

  9. AsyncGeneratorCompleteStep(gen, completion, false, previousRealm) işlemini gerçekleştir.

  10. queue, gen.[[AsyncGeneratorQueue]] olsun.

  11. Eğer queue boş değilse, o zaman

    1. NOTE: Yürütme, jeneratör askıya alınmadan devam eder.

    2. toYield, queue listesinin ilk elemanı olsun.

    3. resumptionValue, Completion(toYield.[[Completion]]) olsun.

    4. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue) döndür.

  12. Set gen.[[AsyncGeneratorState]] to suspended-yield.

  13. genContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve yürütme bağlamı yığınının (execution context stack) tepesinde bulunan yürütme bağlamını (execution context) çalışan yürütme bağlamı (running execution context) olarak geri yükle.

  14. callerContext, çalışan yürütme bağlamı (running execution context) olsun.

  15. undefined geçirerek callerContext bağlamını yeniden başlat. Eğer genContext daha sonra tekrar yeniden başlatılırsa, resumptionValue, yeniden başlatıldığı Tamamlanma Kaydı (Completion Record) olsun.

  16. Assert: Denetim buraya ulaşırsa, o zaman genContext yine çalışan yürütme bağlamıdır (running execution context).

  17. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue) döndür.

27.6.3.9 AsyncGeneratorAwaitReturn ( gen )

AsyncGeneratorAwaitReturn soyut işlemi; gen (bir AsyncGenerator) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: gen.[[AsyncGeneratorState]] değeri draining-queue'dur.

  2. queue, gen.[[AsyncGeneratorQueue]] olsun.

  3. Assert: queue boş değildir.

  4. next, queue listesinin ilk elemanı olsun.

  5. completion, Completion(next.[[Completion]]) olsun.

  6. Assert: completion bir dönüş tamamlanmasıdır (return completion).

  7. promiseCompletion, Completion(PromiseResolve(%Promise%, completion.[[Value]])) olsun.

  8. Eğer promiseCompletion bir ani tamamlanma (abrupt completion) ise, o zaman

    1. AsyncGeneratorCompleteStep(gen, promiseCompletion, true).

    2. AsyncGeneratorDrainQueue(gen) işlemini gerçekleştir.

    3. unused döndür.

  9. Assert: promiseCompletion bir olağan tamamlanmadır (normal completion).

  10. promise, promiseCompletion.[[Value]] olsun.

  11. fulfilledClosure, (value) parametrelerine sahip, gen değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Assert: gen.[[AsyncGeneratorState]] değeri draining-queue'dur.

    2. result, NormalCompletion(value) olsun.

    3. AsyncGeneratorCompleteStep(gen, result, true).

    4. AsyncGeneratorDrainQueue(gen) işlemini gerçekleştir.

    5. NormalCompletion(undefined) döndür.

  12. onFulfilled, CreateBuiltinFunction(fulfilledClosure, 1, "", « ») olsun.

  13. rejectedClosure, (reason) parametrelerine sahip, gen değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Assert: gen.[[AsyncGeneratorState]] değeri draining-queue'dur.

    2. result, ThrowCompletion(reason) olsun.

    3. AsyncGeneratorCompleteStep(gen, result, true).

    4. AsyncGeneratorDrainQueue(gen) işlemini gerçekleştir.

    5. NormalCompletion(undefined) döndür.

  14. onRejected, CreateBuiltinFunction(rejectedClosure, 1, "", « ») olsun.

  15. PerformPromiseThen(promise, onFulfilled, onRejected) işlemini gerçekleştir.

  16. unused döndür.

27.6.3.10 AsyncGeneratorDrainQueue ( gen )

AsyncGeneratorDrainQueue soyut işlemi; gen (bir AsyncGenerator) argümanını alır ve unused döndürür. Jeneratörün AsyncGeneratorQueue kuyruğunu, bir dönüş tamamlanması (return completion) içeren bir AsyncGeneratorRequest kaydıyla karşılaşana kadar boşaltır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: gen.[[AsyncGeneratorState]] değeri draining-queue'dur.

  2. queue, gen.[[AsyncGeneratorQueue]] olsun.

  3. queue boş olmadığı sürece tekrarla:

    1. next, queue listesinin ilk elemanı olsun.

    2. completion, Completion(next.[[Completion]]) olsun.

    3. Eğer completion bir dönüş tamamlanması (return completion) ise, o zaman

      1. AsyncGeneratorAwaitReturn(gen) işlemini gerçekleştir.

      2. unused döndür.

    4. Eğer completion bir olağan tamamlanma (normal completion) ise, o zaman

      1. completion değerini NormalCompletion(undefined) olarak güncelle.
    5. AsyncGeneratorCompleteStep(gen, completion, true) işlemini gerçekleştir.

  4. gen.[[AsyncGeneratorState]] değerini completed olarak ayarla.

  5. unused döndür.

27.7 AsyncFunction Nesneleri (AsyncFunction Objects)

AsyncFunction nesneleri, genellikle AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncMethod ve AsyncArrowFunction ifadelerinin değerlendirilmesiyle oluşturulan fonksiyonlardır. Ayrıca %AsyncFunction% içsel nesnesi çağrılarak da oluşturulabilirler.

27.7.1 AsyncFunction Yapıcısı (The AsyncFunction Constructor)

AsyncFunction yapıcısı (constructor):

  • %AsyncFunction% nesnesidir.

  • Function yapıcısının bir alt sınıfıdır.

  • bir yapıcı olarak değil de bir fonksiyon olarak çağrıldığında yeni bir AsyncFunction oluşturur ve başlatır. Bu nedenle, AsyncFunction(...) fonksiyon çağrısı, aynı argümanlarla yapılan new AsyncFunction(...) nesne oluşturma ifadesiyle eş değerdir.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen AsyncFunction davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors), yerleşik asenkron fonksiyon davranışı için gerekli dahili yuvalara sahip alt sınıf örneklerini oluşturmak ve başlatmak için AsyncFunction yapıcısına (constructor) bir super çağrısı içermelidir. Asenkron fonksiyon nesnelerini (function objects) tanımlamaya yönelik tüm ECMAScript sözdizimsel biçimleri, doğrudan AsyncFunction örnekleri oluşturur. AsyncFunction alt sınıflarının örneklerini oluşturmak için sözdizimsel bir yol yoktur.

27.7.1.1 AsyncFunction ( ...paramArgs, bodyArg )

Son argüman (eğer varsa) bir asenkron fonksiyonun gövdesini (yürütülebilir kod) belirtir. Önceki tüm argümanlar formal parametreleri belirtir.

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

  2. Eğer bodyArg mevcut değilse, bodyArg değerini boş Dize olarak ayarla.

  3. Dönüş değeri: ? CreateDynamicFunction(activeFunc, NewTarget, async, paramArgs, bodyArg).

27.7.2 AsyncFunction Yapıcısının Özellikleri (Properties of the AsyncFunction Constructor)

AsyncFunction yapıcısı (constructor):

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype özelliğinin ilk değeri AsyncFunction prototip nesnesidir (AsyncFunction prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

27.7.3 AsyncFunction Prototip Nesnesinin Özellikleri (Properties of the AsyncFunction Prototype Object)

AsyncFunction prototip nesnesi:

27.7.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor özelliğinin ilk değeri %AsyncFunction% nesnesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri "AsyncFunction" dizesidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

27.7.4 AsyncFunction Örnekleri (AsyncFunction Instances)

Her AsyncFunction örneği bir ECMAScript fonksiyon nesnesidir (function object) ve Tablo 25 içinde listelenen dahili yuvalara sahiptir. Bu tür tüm örnekler için [[IsClassConstructor]] dahili yuvasının değeri false'dur. AsyncFunction örnekleri yapıcılar (constructors) değildir ve [[Construct]] dahili metoduna sahip değildir. AsyncFunction örnekleri, oluşturulabilir (constructable) olmadıkları için prototype özelliğine sahip değildir.

Her AsyncFunction örneği aşağıdaki kendi özelliklerine (own properties) sahiptir:

27.7.4.1 length

20.2.4.1 içinde Function örneklerinin "length" özelliği için verilen şartname, AsyncFunction örnekleri için de geçerlidir.

27.7.4.2 name

20.2.4.2 içinde Function örneklerinin "name" özelliği için verilen şartname, AsyncFunction örnekleri için de geçerlidir.

27.7.5 Asenkron Fonksiyonların Soyut İşlemleri (Async Functions Abstract Operations)

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFuncBody )

AsyncFunctionStart soyut işlemi; promiseCapability (bir PromiseCapability Kaydı) ve asyncFuncBody (bir FunctionBody Ayrıştırma Düğümü (Parse Node), bir ExpressionBody Ayrıştırma Düğümü (Parse Node) veya parametresiz bir [Soyut Kapanış (Abstract Closure)]) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. runningContext, çalışan yürütme bağlamı (running execution context) olsun.

  2. asyncContext, runningContext nesnesinin bir kopyası olsun.

  3. NOTE: AsyncBlockStart işleminin yürütmesini sürdürmesi için yürütme durumunun kopyalanması gereklidir. Şu anda yürütülen bir bağlamın yürütmesini sürdürmek tanımsızdır.

  4. AsyncBlockStart(promiseCapability, asyncFuncBody, asyncContext) işlemini gerçekleştir.

  5. unused döndür.

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

AsyncBlockStart soyut işlemi; promiseCapability (bir PromiseCapability Kaydı), asyncBody (bir Ayrıştırma Düğümü (Parse Node) veya parametresiz bir [Soyut Kapanış (Abstract Closure)]) ve asyncContext (bir yürütme bağlamı (execution context)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. closure, promiseCapability ve asyncBody değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. acAsyncContext, çalışan yürütme bağlamı (running execution context) olsun.

    2. Eğer asyncBody bir Ayrıştırma Düğümü (Parse Node) ise, o zaman

      1. result, Completion(asyncBody için Değerlendirme (Evaluation)) olsun.
    3. Değilse,

      1. Assert: asyncBody parametresiz bir Soyut Kapanış (Abstract Closure)'tır.

      2. result, Completion(asyncBody()) olsun.

    4. Assert: Denetim buraya ulaşırsa, asenkron fonksiyon ya bir istisna fırlatmıştır ya da örtük veya açık bir geri dönüş gerçekleştirmiştir; tüm await işlemleri tamamlanmıştır.

    5. acAsyncContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve yürütme bağlamı yığınının (execution context stack) tepesinde bulunan yürütme bağlamını (execution context) çalışan yürütme bağlamı (running execution context) olarak geri yükle.

    6. Eğer result bir olağan tamamlanma (normal completion) ise, o zaman

      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») işlemini gerçekleştir.
    7. Else if result bir dönüş tamamlanması (return completion) ise, o zaman

      1. ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») işlemini gerçekleştir.
    8. Değilse,

      1. Assert: result bir fırlatma tamamlanması (throw completion)'tır.

      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») işlemini gerçekleştir.

    9. NormalCompletion(unused) döndür.

  2. asyncContext bağlamının kod değerlendirme durumunu, o yürütme bağlamı (execution context) için değerlendirme yeniden başlatıldığında, closure parametresiz olarak çağrılacak şekilde ayarla.

  3. result, ! RunSuspendedContext(asyncContext, NormalCompletion(empty)) olsun.

  4. Assert: result değeri unused'dur.

  5. NOTE: result değerlerinin olası kaynakları Await veya eğer asenkron fonksiyon hiçbir şeyi await etmiyorsa, yukarıdaki 1.f adımıdır.

  6. unused döndür.

27.7.5.3 Await ( arg )

Await soyut işlemi; arg (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) veya empty içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. asyncContext, çalışan yürütme bağlamı (running execution context) olsun.

  2. promise, ? PromiseResolve(%Promise%, arg) olsun.

  3. fulfilledClosure, (v) parametrelerine sahip, asyncContext değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Completion(RunSuspendedContext(asyncContext, NormalCompletion(v))) işlemini gerçekleştir.

    2. NOTE: RunSuspendedContext tarafından döndürülen Tamamlanma Kaydı (Completion Record) kasıtlı olarak yok sayılır.

    3. NormalCompletion(undefined) döndür.

  4. onFulfilled, CreateBuiltinFunction(fulfilledClosure, 1, "", « ») olsun.

  5. rejectedClosure, (reason) parametrelerine sahip, asyncContext değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason))) işlemini gerçekleştir.

    2. NOTE: RunSuspendedContext tarafından döndürülen Tamamlanma Kaydı (Completion Record) kasıtlı olarak yok sayılır.

    3. NormalCompletion(undefined) döndür.

  6. onRejected, CreateBuiltinFunction(rejectedClosure, 1, "", « ») olsun.

  7. PerformPromiseThen(promise, onFulfilled, onRejected) işlemini gerçekleştir.

  8. asyncContext bağlamını yürütme bağlamı yığınından (execution context stack) çıkar ve yürütme bağlamı yığınının (execution context stack) tepesinde bulunan yürütme bağlamını (execution context) çalışan yürütme bağlamı (running execution context) olarak geri yükle.

  9. callerContext, çalışan yürütme bağlamı (running execution context) olsun.

  10. empty geçirerek callerContext bağlamını yeniden başlat. Eğer asyncContext daha sonra tekrar yeniden başlatılırsa, completion, yeniden başlatıldığı Tamamlanma Kaydı (Completion Record) olsun.

  11. Assert: Denetim buraya ulaşırsa, o zaman asyncContext yine çalışan yürütme bağlamıdır (running execution context).

  12. completion döndür.