Краще написати код, який не покладається на терміни негайних зворотних викликів (наприклад, мікрозадачі проти макрозадач), але давайте відкладемо це на час.
setTimeoutчерги макрозадачі, яка, як мінімум, чекає запуску, поки всі мікротеки (і мікрозадачі, які вони нерестуються) закінчуються. Ось приклад:
console.log('Macrotask queued');
setTimeout(function() {
console.log('Macrotask running');
});
Promise.resolve()
.then(function() {
console.log('Microtask running');
});
console.log('Microtask queued');
console.log('Last line of script');
Поведінка .thenна вирішеному Обіцянні принципово відрізняється від поведінки негайного setTimeoutзворотного виклику - Обіцянок .thenбуде виконуватися першим, навіть якщо setTimeoutспочатку було поставлено чергу. Але обіцянки підтримують лише сучасні браузери. Як особливу функціональність мікротеки можна правильно заповнити, якщо її Promiseнемає?
Якщо ви спробуєте наслідувати .thenмікротеки 's, використовуючи setTimeout, ви ставите в чергу макротаків, а не мікротаків, тому погано заповнений .thenне буде запущений у потрібний час, якщо макросклад уже в черзі.
Є рішення, яке використовує MutationObserver, але воно виглядає некрасиво, і не для чого MutationObserver. Також MutationObserverне підтримується в IE10 і раніше. Якщо ви хочете встановити чергу з мікрозадачею в середовищі, яке не підтримує обіцянок, чи є кращі альтернативи?
(Я насправді не намагаюся підтримувати IE10 - це лише теоретична вправа щодо того, як мікрозадачі можна ставити в чергу без обіцянок)
schedule.jsбуде освічуючо.