> Что делать чтобы не блокировать основной поток при обработке большого массива без использования web workers (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Garage Eight

Стек: JavaScript

> Пример ответа

Чтобы не блокировать основной поток при обработке большого массива без Web Workers, можно использовать следующие подходы:

  1. Разбиение задачи на части с setTimeout / setInterval
    Разделите массив на небольшие порции и обрабатывайте их асинхронно, давая браузеру время на рендеринг и обработку событий между итерациями:

    JAVASCRIPT
    function processLargeArray(array, chunkSize) {
    let index = 0;
    function processChunk() {
    const chunk = array.slice(index, index + chunkSize);
    // Обработка chunk
    index += chunkSize;
    if (index < array.length) {
    setTimeout(processChunk, 0); // или requestAnimationFrame
    }
    }
    processChunk();
    }
  2. Использование requestAnimationFrame
    Если обработка связана с визуальными изменениями, requestAnimationFrame синхронизирует выполнение с циклом рендеринга:

    JAVASCRIPT
    function processWithRAF(array, batchSize) {
    let i = 0;
    function batch() {
    for (let j = 0; j < batchSize && i < array.length; j++, i++) {
    // Обработка array[i]
    }
    if (i < array.length) requestAnimationFrame(batch);
    }
    requestAnimationFrame(batch);
    }
  3. Асинхронные функции с setTimeout
    Используйте async/await с искусственной задержкой для разбиения:

    JAVASCRIPT
    async function processAsync(array) {
    for (let i = 0; i < array.length; i++) {
    // Обработка array[i]
    if (i % 1000 === 0) await new Promise(resolve => setTimeout(resolve, 0));
    }
    }
  4. Генераторы и yield
    Создайте генератор, который возвращает части данных, и обрабатывайте их в цикле с паузами:

    JAVASCRIPT
    function* chunkGenerator(array, size) {
    for (let i = 0; i < array.length; i += size) yield array.slice(i, i + size);
    }
    const gen = chunkGenerator(largeArray, 500);
    function nextChunk() {
    const { value, done } = gen.next();
    if (!done) {
    // Обработка value
    setTimeout(nextChunk, 0);
    }
    }
    nextChunk();

Эти методы не решают проблему полностью для очень тяжелых вычислений, но позволяют сохранить отзывчивость интерфейса за счет дробления работы на микро-задачи.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью