Постраничная загрузка как итератор
Условие
createPages(fetchPage): асинхронный итератор, отдающий элементы по одному, подгружая страницы по мере необходимости. fetchPage(cursor) возвращает { items, next }; next === null означает конец.
Что проверяют тесты
проходит все страницы
лениво: следующая страница не грузится заранее
одна страница
пустой результат
досрочный выход прекращает загрузку
Как подойти
Асинхронный итератор прячет пагинацию за обычным циклом: потребитель пишет for await и не знает про курсоры. Ленивость даётся бесплатно - генератор не двинется дальше, пока не попросят следующий элемент, поэтому досрочный выход экономит запросы. Тот же приём для чтения потока ответа, построчного разбора и бесконечной ленты.
Подсказки: 3
- Асинхронный генератор объявляется как async *Symbol.asyncIterator.
- yield отдаёт элемент и замирает до следующего запроса - отсюда ленивость.
- break в цикле for await закрывает генератор.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.