JavaScript Generator — функція, яку можна ставити на паузу


Генератор — функція, яку можна поставити на паузу: yield віддає значення й заморожує виконання до наступного виклику next().

автор: NagarD

Загальний опис

Звичайна функція працює за принципом «увійшов — вийшов»: почалася, добігла до return, померла. Генератор інший — він пам'ятає, де зупинився, і продовжує звідти.

Оголошується він через function*, а віддає значення через yield. Викликаєш його — і отримуєш не результат, а об'єкт-ітератор; код усередині не виконався ще ані на рядок. Кожен next() проганяє його до наступного yield.

Звідси головна суперсила: лінива нескінченність. Генератор може описувати нескінченну послідовність (усі числа Фібоначчі, усі id), не займаючи пам'яті — значення народжуються лише тоді, коли їх попросили.

автор: NagarD

Порада

Генератор працює в for...of і в спред-операторі — тобто це готовий ітератор без жодного зайвого коду.

автор: NagarD
Нотатка

Нескінченний генератор не можна розгортати спредом ([...infinite()]) — браузер зависне. Бери з нього рівно стільки, скільки треба.

автор: NagarD

Синтаксис

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

методи

Метод Опис
next Продовжує виконання до наступного yield; повертає {value, done}.
return Завершує генератор із заданим значенням.
throw Кидає виняток усередині генератора.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
Generator 39+ 26+ 10+ 26+ 13+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід