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(${url}?page=${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(Получено ${items.length} записей); items.forEach(user => console.log(- ${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(Температура: ${data.temperature.toFixed(1)}°C); readings.push(data);
} console.log(Всего получено: ${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 [${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 | #фишки