setTimeout(fn, 0) планирует fn как макротаск, а Promise.resolve().then(fn) планирует fn как микротаск. Эти две очереди имеют разные приоритеты в event loop JavaScript.
Event loop обрабатывает очереди в таком порядке:
Это означает, что микротаски всегда выполняются перед макротасками, независимо от того, когда они были запланированы.
console.log('start');
setTimeout(() => console.log('macrotask'), 0);
Promise.resolve().then(() => console.log('microtask'));
console.log('end');
Вывод:
start
end
microtask
macrotask
Promise.resolve().then(fn), когда нужно, чтобы fn выполнился как можно скорее, до любого рендеринга или I/O-колбэковsetTimeout(fn, 0), когда ты намеренно хочешь отложить работу на следующую итерацию event loopPromise, queueMicrotask()setTimeout, setInterval, I/O-событияВ JavaScript event loop все microtask обрабатываются перед выполнением одного macrotask из очереди macrotask.
Новый — ещё не проверен сообществом
Вы