Middle+
38
Эмне үчүн sleep(2000) жана sleep(1000) эки жолу чакырылганда, биринчи кезекте 1 секунддук лог чыгат, андан кийин 2? Event Loop, микро жана макро тапшырмаларынын иштешин түшүндүрүңүз.
Кайсыл жерде компаниялар сурады
Яндекс
AIден жооп
sobes.tech AI
В JavaScript таймеры, такие как setTimeout или sleep (если реализован через промисы), работают асинхронно и ставят задачи в очередь событий (Event Loop).
Когда вызываются sleep(2000) и sleep(1000), оба запускают таймеры, но второй (на 1000 мс) завершится раньше, чем первый (на 2000 мс). После истечения времени таймера соответствующая callback-функция помещается в очередь макротасков (task queue).
Event Loop работает так:
- Выполняет текущий стек вызовов.
- После очистки стека берет задачи из очереди макротасков и выполняет их по очереди.
- После выполнения макротасков выполняет все микротаски (microtasks), например, промисы.
В данном случае:
sleep(1000)завершится раньше, его callback попадет в очередь и выполнится первым.sleep(2000)завершится позже, его callback выполнится после.
Таким образом, лог с 1 секундой выводится раньше, чем с 2.
Пример с промисами и таймерами:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function test() {
sleep(2000).then(() => console.log('2 секунды')); // выполнится позже
sleep(1000).then(() => console.log('1 секунда')); // выполнится раньше
}
test();
Здесь видно, что несмотря на порядок вызовов, вывод будет "1 секунда" затем "2 секунды" из-за разного времени таймеров и работы Event Loop.