JavaScript Generator — функція, яку можна ставити на паузу
Генератор — функція, яку можна поставити на паузу: yield віддає значення й заморожує виконання до наступного виклику next().
Загальний опис
Звичайна функція працює за принципом «увійшов — вийшов»: почалася, добігла до return, померла. Генератор інший — він пам'ятає, де зупинився, і продовжує звідти.
Оголошується він через function*, а віддає значення через yield. Викликаєш його — і отримуєш не результат, а об'єкт-ітератор; код усередині не виконався ще ані на рядок. Кожен next() проганяє його до наступного yield.
Звідси головна суперсила: лінива нескінченність. Генератор може описувати нескінченну послідовність (усі числа Фібоначчі, усі id), не займаючи пам'яті — значення народжуються лише тоді, коли їх попросили.
автор: NagarD
- Порада
-
Генератор працює в
автор: NagarDfor...ofі в спред-операторі — тобто це готовий ітератор без жодного зайвого коду. - Нотатка
-
Нескінченний генератор не можна розгортати спредом (
автор: NagarD[...infinite()]) — браузер зависне. Бери з нього рівно стільки, скільки треба.
Синтаксис
function* gen() { yield 1; yield 2; }
методи
| Метод | Опис |
|---|---|
| next | Продовжує виконання до наступного yield; повертає {value, done}. |
| return | Завершує генератор із заданим значенням. |
| throw | Кидає виняток усередині генератора. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| Generator | 39+ | 26+ | 10+ | 26+ | 13+ | - |
| Переглядач | ||||
|---|---|---|---|---|
| Generator | 39+ | yes | yes | 10+ |
Приклади
+ запропонувати свій приклад у пісочниці
Скінченний генератор, нескінченний лічильник і Фібоначчі.
function* colors() {
yield 'червоний';
yield 'зелений';
yield 'синій';
}
for (const color of colors()) {
console.log(color);
}
// нескінченна послідовність — але пам'яті не займає
function* fibonacci() {
let [a, b] = [0, 1];
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const fib = fibonacci();
// беремо рівно стільки, скільки треба
console.log(fib.next().value, fib.next().value, fib.next().value); // 0 1 1
Коментарі
Коментарів ще немає — будьте першим!