archi_kud
@archi_kud
Frontend Developer

Что является макрозадачей?

Здравствуйте, прочитал несколько статей про цикл событий и узнал про макрозадачи и микрозадачи. Основную концепцию понял, что на каждой итерации цикл событий выполняет одну макрозадачу и потом все микрозадачи. В этой статье было написано, что макрозадачи - это setTimeout, setInterval и setImmediate, а микрозадачи - это Promise, MutationObserver и process.nextTick. В примере был приведен следующий код:

console.log('script start');

setTimeout(() => console.log('setTimeout'), 0);

Promise.resolve()
    .then(() => console.log('promise1'))
    .then(() => console.log('promise2'));

console.log('script end');

// script start
// script end
// promise1
// promise2
// setTimeout


К я сам понял Promise`ы выполняются до setTimeout, так как они выполняются после макрозадачи, а первой макрозадачей является вызов скрипта. Что на самом деле является макрозадачей, кроме setTimeout, setInterval и setImmediate?
  • Вопрос задан
  • 8231 просмотр
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
Чем описывать тут своими словами лучше дать ссыль на хороший, годный доклад
https://habr.com/ru/company/oleg-bunin/blog/417461/

Макро и микрозадач нет, есть tasks и jobs (иногда таки называют микротасками). Tasks выполняются в цикле, по мере появления в коллстэке (это xhr, fetch, setTimeout, browser events), а jobs (Promise, Mutation observer) сразу после тасков в текущем цикле, причем если job был добавлен в этом цикле (в task или в job перед ним), то и выполнен он будет в этом же цикле, в отличие от таска. Это позволяет выполнить промис-цепочку почти синхронно, но добавляет опасность заблочить цикл.

В ноде все это работает по-другому.

Ну и евент луп не относится к javascript, а определяется окружением, в нашем случае - браузером.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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