На самом деле, нет хорошего ответа на этот вопрос, потому что именно так работает браузер / js.Быстрое и грязное решение состоит в том, чтобы обернуть ваш обратный вызов в setTimeout или, еще лучше, requestAnimationFrame:
// setTimeout(callback, 0);
requestAnimationFrame(callback);
Это будет гарантировать, что цикл обработки событий может «обернуться», выполнить некоторую рисование, а затем выполнить вашобратный вызов.
Пока выполняется синхронный код, остальные части механизма времени выполнения просто будут ждать своей очереди.Только когда произойдет асинхронная операция (например, setTimeout или RAF), браузер скажет: «Хорошо, больше ничего не нужно делать, давайте раскрасим экран с любыми изменениями и посмотрим в очереди на любой другой JS, который являетсяготов к исполнению ».
Вот мой любимый разговор на эту тему.Это может быть немного глубоко, если вы новичок в ремесле, но это даст вам ногу вверх, если вы обратите пристальное внимание.
https://youtu.be/cCOL7MC4Pl0