Проверяет понимание потоковой обработки больших JSON-данных без блокировки основного потока в браузере или Node.js.
Когда вы получаете большой JSON (например, 100 МБ) и пытаетесь распарсить его целиком через JSON.parse, основной поток блокируется на время парсинга. В браузере это приводит к зависанию интерфейса, а в Node.js — к остановке обработки других запросов. Потоковый подход решает эту проблему, разбивая данные на чанки и обрабатывая их по мере поступления.
Генераторы (function*) позволяют приостановить выполнение функции в точке yield и возобновить позже. Это идеально для пошаговой обработки: вы читаете следующий чанк, обрабатываете его, затем yield, чтобы дать основному потоку передышку. Пример:
async function* streamJSON(reader) {
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
// Ищем границы JSON-объектов в буфере
let boundary;
while ((boundary = buffer.indexOf('\n')) !== -1) {
const line = buffer.slice(0, boundary);
buffer = buffer.slice(boundary + 1);
if (line.trim()) yield JSON.parse(line);
}
}
}Здесь каждый yield возвращает один объект, а вызывающий код может обработать его и затем запросить следующий.
В браузере requestIdleCallback позволяет выполнить задачу, когда браузер простаивает. Вы можете комбинировать его с генератором: после обработки каждого чанка планируйте следующую итерацию через requestIdleCallback, чтобы не мешать анимациям и вводу пользователя. Пример:
function processChunk(gen) {
const result = gen.next();
if (!result.done) {
// Обработка result.value
requestIdleCallback(() => processChunk(gen));
}
}Такой подход используется при работе с NDJSON (JSON Lines), когда каждая строка — отдельный объект, или при чтении больших файлов через File API. В Node.js можно использовать ReadableStream и аналогичные генераторы для обработки потоков из файловой системы или сети.
Потоковый разбор JSON с генераторами и планировщиками — это мощный способ сохранить отзывчивость приложения при работе с большими данными. Применяйте его, когда размер JSON превышает несколько мегабайт или когда важна плавность интерфейса. Для небольших данных обычный JSON.parse остаётся проще и быстрее.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию