jkeks блог


Пауза в JavaScript, синхронный код и ожидание событий.

21.12.2020 - 814 просмотрa ;)




Какой противный этот 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));
}

и только тогда уже мы видим нормальный синхронный код с ожиданием событий. И наш код стает красивым и добрым, а его поддержка приятной и ясной как день.





 



Сегодня: 2021.01.21
Рейтинг@Mail.ru