Краще написати код, який не покладається на терміни негайних зворотних викликів (наприклад, мікрозадачі проти макрозадач), але давайте відкладемо це на час.
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
буде освічуючо.