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

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

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

let promise = Promise.resolve();

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

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

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

26 ответов

14 просмотров

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
Коллеги, доброе утро. Запустил на удаленном хосте приложение (ручками зашел туда по ssh и запустил, не командой удаленно). Создал потом ssh-туннель, и с моей машины приложение...
Δημήτηρ
9
Карта сайта