Об'єкт 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