Правильный способ сделать то, что вы хотите, заключается в следующем:
function test() {
step1();
setTimeout(step3, 5000);
}
function step1() {
document.getElementById("modal-overlay").style.display = "inline";
document.getElementById("paragraph").innerText = "Do you see this text?";
}
function step3() {
document.getElementById("modal-overlay").style.display = "none";
document.getElementById("paragraph").innerText = "Only this text is shown at the end of the process";
}
Разница в том, что setTimeout
является "асинхронным". Он позволяет другому коду продолжать работу и возвращается к выполнению функции, которую вы ему предоставили (здесь step3
) после истечения желаемого интервала времени.
Ваша исходная версия пытается "подождать" в течение 5 секунд "синхронно" - в основном заставляя код выполнять пустой цикл и проверять временную метку на каждой итерации, пока не пройдет достаточно времени. В течение этого времени выполняется код - код, который сам по себе не имеет наблюдаемого эффекта, но, тем не менее, код все еще выполняется. Поскольку Javascript является однопоточным, это останавливает что-либо еще на странице. В частности, он останавливает обновления DOM, поэтому ваш код не работает так, как вы ожидали.
Еще серьезнее, однако, он вообще не позволяет пользователям взаимодействовать с браузером - независимо от того, пытаются ли они что-то щелкнуть, прокрутить страницу или что-то еще, браузер может показаться полностью не отвечающим. И это главная причина, почему вы всегда должны использовать асинхронные функции для таких целей, а не создавать искусственный цикл, чтобы остановить что-либо происходящее.