Generator

Об'єкт Generator повертається функцією-генератором та відповідає як протоколу ітерабельного об'єкта, так і протоколу ітератора.

Синтаксис

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
}

var g = gen(); // "Generator { }"

Методи

Generator.prototype.next()
Повертає значення, видане виразом yield.
Generator.prototype.return()
Повертає надане значення та завершує генератор.
Generator.prototype.throw()
Викидає помилку у генераторі (також завершує генератор, якщо помилка не була перехоплена всередині генератора).

Приклад

Нескінченний ітератор

function* idMaker() {
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

Застарілі об'єкти-генератори

Firefox (SpiderMonkey) також реалізував більш ранню версію генераторів у JavaScript 1.7, де зірочка (*) у оголошенні функції не була потрібна (ви просто використовували ключове слово yield у тілі функції). Однак, підтримка застарілих генераторів була прибрана, починаючи з Firefox 58 (вийшов 23 січня, 2018) (bug 1083482).

Методи застарілого генератора

Generator.prototype.next()
Повертає значення, видане виразом yield. Цей метод відповідає методу next() у об'єкті-генераторі ES2015.
Generator.prototype.close()
Закриває генератор, таким чином, виклик next() викине помилку StopIteration. Цей метод відповідає методу return() у об'єкті-генераторі ES2015.
Generator.prototype.send()
Відсилав значення у генератор. Значення повертається виразом yield та повертає значення, видане наступним виразом yield. Метод send(x) відповідає методу next(x) у об'єкті-генераторі ES2015.
Generator.prototype.throw()
Викидає помилку у генераторі. Цей метод відповідає методу throw() у об'єкті-генераторі ES2015.

Приклад застарілого генератора

function* fibonacci() {
  var a = yield 1;
  yield a * 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.send(10)); // 20
console.log(it.close());  // undefined
console.log(it.next());   // викидає StopIteration (бо генератор вже закритий)

Специфікації

Специфікація Статус Коментар
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Generator objects' in that specification.
Standard Початкове визначення.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Generator objects' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
GeneratorChrome Full support 39Edge Full support 13Firefox Full support 26IE No support NoOpera Full support 26Safari Full support 10WebView Android Full support 39Chrome Android Full support 39Firefox Android Full support 26Opera Android Full support 26Safari iOS Full support 10Samsung Internet Android Full support 4.0nodejs Full support 4.0.0
Full support 4.0.0
Full support 0.12
Disabled
Disabled From version 0.12: this feature is behind the --harmony runtime flag.
nextChrome Full support 39Edge Full support 13Firefox Full support 26IE No support NoOpera Full support 26Safari Full support 10WebView Android Full support 39Chrome Android Full support 39Firefox Android Full support 26Opera Android Full support 26Safari iOS Full support 10Samsung Internet Android Full support 4.0nodejs Full support Yes
returnChrome Full support 50Edge Full support 13Firefox Full support 38IE No support NoOpera Full support 37Safari Full support 10WebView Android Full support 50Chrome Android Full support 50Firefox Android Full support 38Opera Android Full support 37Safari iOS Full support 10Samsung Internet Android Full support 5.0nodejs Full support 6.0.0
throwChrome Full support 39Edge Full support 13Firefox Full support 26IE No support NoOpera Full support 26Safari Full support 10WebView Android Full support 39Chrome Android Full support 39Firefox Android Full support 26Opera Android Full support 26Safari iOS Full support 10Samsung Internet Android Full support 4.0nodejs Full support 4.0.0
Full support 4.0.0
Full support 0.12
Disabled
Disabled From version 0.12: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
User must explicitly enable this feature.
User must explicitly enable this feature.

Див. також

Застарілі генератори

Генератори ES2015