после каждой макрозадачи движок исполняет все задачи из очереди микрозадач перед тем, как выполнить следующую макрозадачу или отобразить изменения на странице, или сделать что-то ещё."
почему в коде
let promise = Promise.resolve();
promise.then(() => alert("промис выполнен"));
alert("код выполнен")
alert("еще что-то")
выполняются алерты(макрозадачи), а только потом then(микрозадача), ведь это противоречит приведенному правилу?
А alert - это не макрозадача, это блокирующий вызов
понятно, значит я не понял еще, что такое макрозадача
Сначала выполняется скрипт, встречается микрозадача => отправляется к микроочереди (then и тд), встречается макро => отправляется к макрозадачам (setTimeout и тд)
"Скрипт" - это тоже макрозадача
это я понял, не понятно что считать макрозадачей
Ну в принципе, да, от нее и пляшем
в гугл есть куча сервисов которые показывают работу ивент лупа на примере
Таймауты, обработчики событий, например
После начала выполнения вашего кода в первой главной макрозадаче (текущий скрипт), пока происходят синхронные операции (включая разные вызовы синхронных функций) - это все происходит в стеке выполнения и никак механизм цикла событий не задействует вообще
если скрипт это макрозадача, то таймаут это не часть скрипта?
он выполняется синхронно, а результат получается со временем
мда, надо все заново штрудить по-ходу
Вызов setTimeout - часть скрипта Но сам колбек, который вызывается со временем, будет вызван как макрозадача
спасибо, не понял
setTimeout(() => { console.log('Timeout'); }, 1000); while (true) {} Что произойдет в данном случае? Сработает ли setTimeout и будет ли напечатано что-то в консоль?
бесконечный цикл заблокирует выполнение
Ну, setTimeout выполнится?
Я ставлю что выполнится
Как это нет? Функция setTimeout, мы ж ее вызвали Если она не выполнится - то мы до цикла и не дойдем
А после каждой итерации эвентлуп берёт следующую задачу?
таймаут это макрозадача, пока мы ждем 1000 мск, мы переходим к другой макрозадаче и там зависаем
Функция setTimeout выполняется в рамках макрозадачи, в которой выполняется весь скрипт. setTimeout говорит браузеру "на колбек, не раньше, чем через n времени выполни". Браузер берет колбек, скрипт ппродолжает выполнение и зацикливается. В этом случае макрозадача одна и она никогда не заканчивается, потому колбек вызван и не будет. Браузер подождет какое-то время, добавит колбек таймаута в очередь макрозадач, но до него никогда не дойдет.
Обсуждают сегодня