@magary4

Ресурсоемкая функция подвешивает браузер?

функция переберает массив большого количества обьектов, и производит определенные вычисления с каждым обьектом. во время выполнения функции в браузере все ужасно тормозит. нагуглил решение обернуть в setTimeout( fun, 1); но по большому счету ничего не поменялось.
как решить эту ситуацию?
  • Вопрос задан
  • 222 просмотра
Решения вопроса 2
dunmaksim
@dunmaksim
Технический писатель
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Проблема простая - JS однопоточный. Более того, он работает в том же потоке, в котором и UI обрабатывается. То есть если вы залочили выполнение перебором - то печаль беда.

Варианты - самый наилучший - вынести тяжелую задачу в WebWorker-ы. Их для этого и придумали.

Другой вариант, если вам важна поддержка старых браузеров - делать паузы через каждые N операций. То есть у вас скажем массив с миллионом айтемов. Можно попробовать все делать асинхронно через setTimeout, что разгрузит event loop и позволит в перерывах UI-ке реагировать. И да это кастыль.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
teotlu
@teotlu
Навёрстываю упущенное
Самый главный совет — оптимизировать работу функции. Что за вычисления производятся над объектами? Может, стоит использовать нативную функцию map для произведения этих вычислений над всеми объектами массива? Может, есть какое-то тяжёлое место в ваших вычислениях, которое в цикле даёт огромный прирост к нагрузке?
А setTimeout посоветовали затем, чтобы функция работала асинхронно и не блокировала весь последующий код. Но если функция сама по себе излишне тяжёлая, это не является решением проблемы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы