G
Ghostly Frontend
@GhostlyFrontend2.6K подп.
600просмотров
22.8%от подписчиков
10 февраля 2026 г.
Score: 660
👩‍💻 Фишка: Async Iterator и for-await-of — итерация по асинхронным данным Асинхронные итераторы и цикл for-await-of позволяют последовательно обрабатывать асинхронные данные, такие как стримы, пагинированные API или события. Идеально для работы с постепенно поступающими данными. // Асинхронный генератор для пагинированных данных async function fetchPaginatedData(url, limit = 3) { let page = 1; while (page <= limit) { // Имитация асинхронного запроса const response = await fetch(&#036;{url}?page=&#036;{page}); const data = await response.json(); yield data.items; // Возвращаем данные текущей страницы page++; // Останавливаемся если данных больше нет if (!data.hasNextPage) break; } } // Использование с for-await-of (async () => { console.log('Начинаем загрузку данных...'); try { for await (const items of fetchPaginatedData('/api/users')) { console.log(Получено &#036;{items.length} записей); items.forEach(user => console.log(- &#036;{user.name})); } } catch (error) { console.error('Ошибка загрузки:', error); } console.log('Загрузка завершена'); })(); // Асинхронный итератор для стрима async function createAsyncStream(source, chunkSize = 10) { let buffer = []; for (const item of source) { buffer.push(item); if (buffer.length >= chunkSize) { yield buffer; // Возвращаем накопленные данные buffer = []; // Очищаем буфер } } // Возвращаем остаток if (buffer.length > 0) { yield buffer; } } // Пример с сенсорными данными async function processSensorData() { const sensor = { async Symbol.asyncIterator { for (let i = 0; i < 5; i++) { await new Promise(resolve => setTimeout(resolve, 500)); yield { temperature: 20 + Math.random() 5, timestamp: Date.now() }; } } }; const readings = []; for await (const data of sensor) { console.log(Температура: &#036;{data.temperature.toFixed(1)}°C); readings.push(data); } console.log(Всего получено: &#036;{readings.length} показаний); } // Обработка нескольких асинхронных источников async function mergeAsyncStreams(...streams) { const promises = streams.map(async function (stream) { for await (const item of stream) { yield item; } }); for (const promise of promises) { for await (const item of promise) { yield item; } } } // Практический пример: логирование в реальном времени async function monitorLogs() { const logStream = { async *Symbol.asyncIterator { while (true) { await new Promise(resolve => setTimeout(resolve, 1000)); yield [&#036;{new Date().toISOString()}] System heartbeat; } } }; let count = 0; for await (const log of logStream) { console.log(log); count++; if (count >= 5) break; // Останавливаемся после 5 логов } } 📌 Преимущества: — Работа с постепенно поступающими данными — Обработка бесконечных стримов — Эффективное потребление памяти — Чистая обработка асинхронных последовательностей — Интеграция с современными API (fetch streams, WebSockets) 🧡 Ghostly Frontend | #фишки
600
просмотров
3060
символов
Да
эмодзи
Нет
медиа

Другие посты @GhostlyFrontend

Все посты канала →
👩‍💻 Фишка: Async Iterator и for-await-of — итерация по аси — @GhostlyFrontend | PostSniper