Выбор ответа Middle Итераторы и генераторы обновлено

Асинхронный генератор в обычном for...of

Вопрос

pages это async function*. Что произойдёт?

for (const page of pages('/api/items')) {
  render(page);
}

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: TypeError: результат синхронно не итерируется, нужен for await. Асинхронный генератор реализует только [Symbol.asyncIterator], а обычный for...of ищет [Symbol.iterator] и, не найдя его, бросает TypeError is not iterable.

Варианты ответа

  1. TypeError: результат синхронно не итерируется, нужен for awaitправильный ответ
  2. Цикл получит промисы страниц вместо самих страниц и не упадёт
  3. Цикл сам дождётся каждой страницы, как если бы стоял await
  4. Цикл выполнится ноль раз без ошибки: итератор сразу вернёт done

Разбор

Асинхронный генератор реализует только [Symbol.asyncIterator], а обычный for...of ищет [Symbol.iterator] и, не найдя его, бросает TypeError is not iterable. Нужен for await (const page of pages(...)) внутри async-функции или модуля. Промисы вместо значений получились бы у обычного генератора, выдающего промисы, но здесь до перебора дело не дойдёт.

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

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