26 мая 2026 г. (изменено: 26 мая 2026 г.)
Канал: @cherkashindev
Я пару месяцев назад сделал экспорт постов из Телеги в свой блог написанный на Astro, и агент навайбкодил мне такую конструкцию — for await.
for await (const message of client.iterMessages(entity, { reverse: false })) {
// ....
}for await...of — это цикл для перебора асинхронных коллекций.
Обычно он используется, когда данные приходят не все сразу, а постепенно: например, из API, базы данных, файла или постраничной загрузки.
Сообщения подгружаются постепенно: for await берёт сообщения одно за другим, а когда текущая загруженная порция заканчивается, iterMessages делает следующий запрос в Telegram за новой порцией.
Минимальный пример выглядит так:
const delay = (value, ms) =>
new Promise((resolve) => setTimeout(() => resolve(value), ms));
async function* makeNumbers() {
yield await delay(1, 1000);
yield await delay(2, 1000);
yield await delay(3, 1000);
}
async function run() {
for await (const number of makeNumbers()) {
console.log(number);
}
}
run();Наиболее простой для понимания пример применения — пагинация. Мы можем инкапсулировать всю работу с получением данных в асинхронном генераторе, и пройтись по коллекции с помощью for await. Реальный пример можно посмотреть здесь или на второй картинке.
⚠️ Важный момент: for await работает последовательно. Он не запускает все итерации параллельно.
👍 — было полезно
👀 — уже знали про for await
А выгруженные посты, можно посмотреть 👉 здесь.