Какой противный этот JavaScript оказался, от слова «совсем».
Как специально в JavaScript нет синхронной паузы. Асинхронный setTimer в некоторых случаях абсолютно бесполезен. А я ожидал что в JAVASCRIPT будет просто :
delay(2000)
но увы.
Как сейчас весь православный мир делает паузы ?
Короче делают это 3 способыми:
высчитыванием времени через объект Даты и пускания пустого цикла (вешая страницу вдребезги напополам)
Промисами + setTimeout, получая в загашник Калбэк хелл
async/await + setTimeout, получая более менее что-то хоть как-то поддающееся логике, но костыль он и есть костыль
Статей по данной теме полно, но вот как выглядит трушный пример:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function delayedGreeting() {
console.log("Hello");
await sleep(2000);
console.log("World!");
await sleep(2000);
console.log("Goodbye!");
}
delayedGreeting();
Мы получили синхронный код, где каждая строка выполняется после окончания предидущей.. Вот бы поржал Билл когда они писали GWBasic и узнали что сейчас творится в ТОПовом языке земного шара.
Конечно же это позор когда код надо делать синхронным, асинхронными методами.
А что если нам надо получить синхронное управление в следующую функцию из предидущей, но только когда в предидущей произойдет асинхронное событие, например onend ?
т.е. нам надо ждать не 10 секунд а неизвестно сколько и не из ретюрна, а из черте какого события.
Тут на помощь приходят глобальные переменные, где по окончании события мы выставляет флаг в объекте window.myOnEnd = 1
А наша пауза превращается в цикл ожидания с интервалом в 100мс например.
function start() {
do("Hello!")
waitEnd()
do("Привет")
waitEnd()
do("we walking around")
}
async function waitEnd(){
while(window.end==0) {await sleep(100)}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
и только тогда уже мы видим нормальный синхронный код с ожиданием событий. И наш код стает красивым и добрым, а его поддержка приятной и ясной как день.