> Как избежать зависания интерфейса при долгих вычислениях в однопоточном JavaScript (JavaScript)

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

Компании: Purrweb

Стек: JavaScript

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

Основная проблема в том, что JavaScript в браузере выполняется в одном потоке (Event Loop). Если запустить синхронный долгий цикл, он заблокирует этот поток, и интерфейс перестанет реагировать на события (клики, скролл, анимации).

Основные способы решения:

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

    JAVASCRIPT
    function processLargeArray(array) {
    let i = 0;
    function chunk() {
    const start = performance.now();
    while (i < array.length && performance.now() - start < 50) {
    // обработка array[i]
    i++;
    }
    if (i < array.length) {
    setTimeout(chunk, 0); // отдаём управление Event Loop
    }
    }
    chunk();
    }
  2. Web Workers
    Самый надёжный способ - вынести вычисления в отдельный поток:

    JAVASCRIPT
    // main.js
    const worker = new Worker('worker.js');
    worker.postMessage(data);
    worker.onmessage = (e) => {
    // получаем результат, обновляем UI
    };
    // worker.js
    self.onmessage = (e) => {
    const result = heavyComputation(e.data);
    self.postMessage(result);
    };
  3. requestAnimationFrame для анимаций
    Если нужно обновлять UI в процессе, используйте requestAnimationFrame для синхронизации с кадрами:

    JAVASCRIPT
    function animate() {
    // обновление состояния
    requestAnimationFrame(animate);
    }
  4. Atomics и SharedArrayBuffer
    Для продвинутых сценариев с разделяемой памятью между потоками (требует специальных заголовков безопасности).

Рекомендация: Для большинства задач с долгими вычислениями (обработка изображений, сложные расчёты) используйте Web Workers. Если задача не требует полной изоляции, подойдёт разбиение на части с setTimeout.

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

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