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

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

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

let promise = Promise.resolve();

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

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

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

26 ответов

21 просмотр

А 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 времени выполни". Браузер берет колбек, скрипт ппродолжает выполнение и зацикливается. В этом случае макрозадача одна и она никогда не заканчивается, потому колбек вызван и не будет. Браузер подождет какое-то время, добавит колбек таймаута в очередь макрозадач, но до него никогда не дойдет.

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта