Чтобы увидеть проблему в действии, см. этот jsbin. Нажатие на кнопку вызывает buttonHandler()
, который выглядит следующим образом:
function buttonHandler() {
var elm = document.getElementById("progress");
elm.innerHTML = "thinking";
longPrimeCalc();
}
Вы ожидаете, что этот код изменит текст div на "мышление", а затем запустит longPrimeCalc()
, арифметическую функцию, которая занимает несколько секунд. Однако это не то, что происходит. Вместо этого "longPrimeCalc" завершается первым, а затем текст обновляется до "мышления" после его выполнения, как если бы порядок двух строк кода был отменен.
Похоже, что браузер не запускает код "innerHTML" синхронно, но вместо этого создает для него новый поток, который выполняется на собственном отдыхе.
Мои вопросы:
- Что происходит под капотом, что ведет к такому поведению?
- Как я могу заставить браузер вести себя так, как я ожидал бы, т.е. заставить его обновлять "innerHTML" до того, как он выполнит "
longPrimeCalc()
"?
Я тестировал это в последней версии хром.