Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Макротаски (Macrotasks) в JavaScript
Макротаски — это задачи, которые выполняются в главном цикле событий (event loop) браузера. Они имеют более низкий приоритет чем микротаски (microtasks).
Примеры макротасков
1. setTimeout и setInterval
console.log("Start");
setTimeout(() => {
console.log("Timeout 1000ms"); // макротаск
}, 1000);
console.log("End");
// Вывод:
// Start
// End
// Timeout 1000ms (через 1000ms)
Любой setTimeout, даже с задержкой 0, — это макротаск:
console.log("1");
setTimeout(() => console.log("2"), 0); // макротаск
console.log("3");
// Вывод: 1, 3, 2
2. setImmediate (Node.js)
// Только в Node.js!
setImmediate(() => {
console.log("Immediate"); // макротаск
});
3. Обработка UI событий
Обработчики событий вроде click, scroll, resize — макротаски:
document.addEventListener("click", () => {
console.log("Click handler"); // макротаск
});
4. Отправка HTTP запросов (XMLHttpRequest, fetch)
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => {
console.log(data); // микротаск (Promise)
});
Сам fetch — макротаск (запрос в сеть), но обработка результата в .then() — микротаск.
5. Rendering и repaint
Браузер запускает rendering как макротаск:
const el = document.getElementById("box");
el.style.width = "100px";
el.offsetWidth; // заставить перерасчёт (reflow)
el.style.width = "200px";
// Браузер выполнит rendering между макротасками
6. messageChannel и postMessage
const channel = new MessageChannel();
channel.port1.onmessage = () => {
console.log("Message received"); // макротаск
};
channel.port2.postMessage("hello");
Полный пример: макротаски vs микротаски
console.log("1. Script start");
// Микротаск
Promise.resolve()
.then(() => console.log("2. Promise"));
// Макротаск
setTimeout(() => {
console.log("3. setTimeout");
}, 0);
// Синхронный код
console.log("4. Script end");
// Вывод:
// 1. Script start
// 4. Script end
// 2. Promise (все микротаски)
// 3. setTimeout (первый макротаск)
Event Loop: порядок выполнения
- Выполнить синхронный код (call stack)
- Выполнить все микротаски (Promise, queueMicrotask)
- Выполнить один макротаск (setTimeout, setInterval, событие)
- Если изменился DOM → выполнить render
- Вернуться на шаг 2
Практический пример с анимацией
// Плохо: requestAnimationFrame ПЕРЕД setTimeout
requestAnimationFrame(() => {
console.log("Frame 1");
});
setTimeout(() => {
console.log("Timeout");
}, 0);
// Вывод: Timeout, Frame 1
// Потому что setTimeout — макротаск, выполнится перед следующим кадром
// Правильно: используй requestAnimationFrame для анимаций
requestAnimationFrame(() => {
console.log("Animation frame"); // это НЕ макротаск, это особое API
});
Запомни
Макротаски:
- setTimeout / setInterval
- setImmediate (Node.js)
- Обработчики событий (click, scroll)
- Fetch запросы
- Rendering браузера
- requestAnimationFrame (технически отдельный уровень, но ближе к макротаскам)
Микротаски (для сравнения):
- Promise (.then, .catch, .finally)
- queueMicrotask()
- MutationObserver
- async/await (основано на Promise)
Макротаски выполняются медленнее микротасок, поэтому для критичной производительности используй микротаски (Promise вместо setTimeout).