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 (ECMA-262)
The definition of 'Generator objects' in that specification.
Living Standard

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

BCD tables only load in the browser

Див. також

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

Генератори ES2015