> Что делать чтобы не блокировать основной поток при обработке большого массива без использования web workers (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Garage Eight
Стек: JavaScript
> Пример ответа
Чтобы не блокировать основной поток при обработке большого массива без Web Workers, можно использовать следующие подходы:
-
Разбиение задачи на части с
setTimeout/setInterval
Разделите массив на небольшие порции и обрабатывайте их асинхронно, давая браузеру время на рендеринг и обработку событий между итерациями:JAVASCRIPTfunction processLargeArray(array, chunkSize) {let index = 0;function processChunk() {const chunk = array.slice(index, index + chunkSize);// Обработка chunkindex += chunkSize;if (index < array.length) {setTimeout(processChunk, 0); // или requestAnimationFrame}}processChunk();} -
Использование
requestAnimationFrame
Если обработка связана с визуальными изменениями,requestAnimationFrameсинхронизирует выполнение с циклом рендеринга:JAVASCRIPTfunction 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);} -
Асинхронные функции с
setTimeout
Используйтеasync/awaitс искусственной задержкой для разбиения:JAVASCRIPTasync function processAsync(array) {for (let i = 0; i < array.length; i++) {// Обработка array[i]if (i % 1000 === 0) await new Promise(resolve => setTimeout(resolve, 0));}} -
Генераторы и
yield
Создайте генератор, который возвращает части данных, и обрабатывайте их в цикле с паузами:JAVASCRIPTfunction* 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) {// Обработка valuesetTimeout(nextChunk, 0);}}nextChunk();
Эти методы не решают проблему полностью для очень тяжелых вычислений, но позволяют сохранить отзывчивость интерфейса за счет дробления работы на микро-задачи.
> Похожие задачи по frontend
Что такое метод map в JavaScript и как он работает
Как реализовать функцию auth через колбек в JavaScript
Почему страница зависает при обработке большого массива в JavaScript
Как реализовать показ попапа через 3 секунды после захода на сайт с возможностью закрытия и запоминанием закрытия между сессиями?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью