169 похожих чатов

Вопрос к знатокам. Вот цитата из https://learn.javascript.ru/ : "Сразу

после каждой макрозадачи движок исполняет все задачи из очереди микрозадач перед тем, как выполнить следующую макрозадачу или отобразить изменения на странице, или сделать что-то ещё."
почему в коде

let promise = Promise.resolve();

promise.then(() => alert("промис выполнен"));

alert("код выполнен")
alert("еще что-то")

выполняются алерты(макрозадачи), а только потом then(микрозадача), ведь это противоречит приведенному правилу?

26 ответов

23 просмотра

А alert - это не макрозадача, это блокирующий вызов

Pavel-Malashenko Автор вопроса
Volodymyr Klimov
А alert - это не макрозадача, это блокирующий вызо...

понятно, значит я не понял еще, что такое макрозадача

Сначала выполняется скрипт, встречается микрозадача => отправляется к микроочереди (then и тд), встречается макро => отправляется к макрозадачам (setTimeout и тд)

Pavel-Malashenko Автор вопроса
Rustem Yuzlibaev
Сначала выполняется скрипт, встречается микрозадач...

это я понял, не понятно что считать макрозадачей

Volodymyr Klimov
"Скрипт" - это тоже макрозадача

Ну в принципе, да, от нее и пляшем

Pavel Malashenko
это я понял, не понятно что считать макрозадачей

в гугл есть куча сервисов которые показывают работу ивент лупа на примере

Pavel Malashenko
понял

После начала выполнения вашего кода в первой главной макрозадаче (текущий скрипт), пока происходят синхронные операции (включая разные вызовы синхронных функций) - это все происходит в стеке выполнения и никак механизм цикла событий не задействует вообще

Pavel-Malashenko Автор вопроса
Volodymyr Klimov
После начала выполнения вашего кода в первой главн...

если скрипт это макрозадача, то таймаут это не часть скрипта?

Pavel Malashenko
если скрипт это макрозадача, то таймаут это не час...

он выполняется синхронно, а результат получается со временем

Pavel-Malashenko Автор вопроса
Pavel Malashenko
если скрипт это макрозадача, то таймаут это не час...

Вызов setTimeout - часть скрипта Но сам колбек, который вызывается со временем, будет вызван как макрозадача

Pavel-Malashenko Автор вопроса

спасибо, не понял

Pavel Malashenko
спасибо, не понял

setTimeout(() => { console.log('Timeout'); }, 1000); while (true) {} Что произойдет в данном случае? Сработает ли setTimeout и будет ли напечатано что-то в консоль?

Pavel-Malashenko Автор вопроса
Volodymyr Klimov
setTimeout(() => { console.log('Timeout');...

бесконечный цикл заблокирует выполнение

Volodymyr Klimov
Ну, setTimeout выполнится?

Я ставлю что выполнится

Pavel Malashenko
нет

Как это нет? Функция setTimeout, мы ж ее вызвали Если она не выполнится - то мы до цикла и не дойдем

Volodymyr Klimov
Как это нет? Функция setTimeout, мы ж ее вызвали ...

А после каждой итерации эвентлуп берёт следующую задачу?

Pavel-Malashenko Автор вопроса
Volodymyr Klimov
Как это нет? Функция setTimeout, мы ж ее вызвали ...

таймаут это макрозадача, пока мы ждем 1000 мск, мы переходим к другой макрозадаче и там зависаем

Pavel Malashenko
таймаут это макрозадача, пока мы ждем 1000 мск, мы...

Функция setTimeout выполняется в рамках макрозадачи, в которой выполняется весь скрипт. setTimeout говорит браузеру "на колбек, не раньше, чем через n времени выполни". Браузер берет колбек, скрипт ппродолжает выполнение и зацикливается. В этом случае макрозадача одна и она никогда не заканчивается, потому колбек вызван и не будет. Браузер подождет какое-то время, добавит колбек таймаута в очередь макрозадач, но до него никогда не дойдет.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
22
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта