Что выведет код Middle Итераторы и генераторы обновлено

finally генератора при break

Вопрос

Что выведет код? По строке на каждый вывод.

function* resource() {
  try {
    yield 'a';
    yield 'b';
    yield 'c';
  } finally {
    console.log('очистка');
  }
}
for (const x of resource()) {
  console.log(x);
  if (x === 'b') break;
}
console.log('после цикла');

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: a, b, очистка, после цикла. При досрочном выходе из for...of цикл вызывает у итератора метод return().

Что выведет

a
b
очистка
после цикла

Разбор

При досрочном выходе из for...of цикл вызывает у итератора метод return(). Генератор завершается в точке, где стоял на yield 'b', и выполняет finally: печатается очистка. До 'c' дело не доходит. Только потом выполняется код после цикла. Так генераторы гарантированно освобождают ресурсы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.