Я предполагаю, что микрозадача обрабатывается какими-то шагами.
И я проверял эти вещи, но я не уверен, что мое предположение верно.
for (let i = 0; i < 2; i += 1) {
setTimeout(() => {
console.info('-- macro --')
queueMicrotask(() => console.info('** micro **'));
});
}
полученные результаты
-- macro --
** micro **
-- macro --
** micro **
for (let i = 0; i < 3; i += 1) {
requestAnimationFrame(() => {
console.info('@@ animation callback @@');
queueMicrotask(() => {
console.info('** micro **');
});
});
}
полученные результаты
@@ animation callback @@
** micro **
@@ animation callback @@
** micro **
@@ animation callback @@
** micro **
Я был удивлен, когда впервые увидел результаты этого теста. Потому что я думал, что все задачи в очереди кадров анимации будут обрабатываться сразу.
Но теперь я думаю, что «при обработке функций обратного вызова кадра анимации проверьте, не пуста ли очередь microTaskQueue, и если внутри есть задача, обработайте ее и вызовите обратный вызов следующего кадра анимации (вставленный функцией requestAnimationFrame
».
Я прав, или я упускаю что-то важное?
Очередь микрозадач посещается каждый раз, когда стек вызовов JS пуст, как часть очистить после запуска скрипта.
- If the JavaScript execution context stack is now empty, perform a microtask checkpoint.
Этот шаг вводится между всеми выполнение обратного вызова анимации из алгоритма вызывать.
Обратите внимание, что обработка событийного цикла также имеет несколько жестко запрограммированных контрольных точек микрозадач, например, в шаг 7, а также при выполнении других обратных вызовов.
Да, больше по опыту, проведя множество тестов, я заметил, что это так. События Mousemove и другие события указателя переводятся в анимированные кадры, я думаю, что щелчок на самом деле не является, но в большинстве тестов, которые я выполнил, результаты были такими, как если бы они были (по крайней мере, в Chrome и FF). Но обратите внимание, что это не означает, что это часть обратных вызовов rAF, просто они ждут «кадра анимации» для выполнения задачи.
Я закончил презентацию о цикле событий. Я действительно чувствую благодаря вам. Хорошего дня.
Пожалуйста. Любопытно, а где была эта презентация? В Сеуле? Я мог бы быть заинтересован посетить когда-нибудь.
Спасибо, Кайидо, твой ответ мне очень помогает. У меня другой вопрос. В этом пример кода, который вы мне даете в этом вопрос, вы сказали события щелчка обычно запускаются из кадра анимации, но мне действительно трудно найти об этом. Читаю Архитектура событий DOM и Обработчики событий, но тяжело