Какой вывод из предложенных вариантов всегда будет верным при выполнении данного JavaScript-кода, учитывая порядок выполнения асинхронных операций?
Подробное объяснение
Код демонстрирует работу event loop в JavaScript. Сначала выполняются все синхронные операции: выводятся 1 и 7. Затем обрабатываются микрозадачи (Promise): выводится 4. После этого выполняются макрозадачи (setTimeout) и колбэки requestAnimationFrame, но их относительный порядок может варьироваться. Однако последовательность 1 → 7 → 4 всегда сохраняется, так как синхронный код и микрозадачи имеют приоритет перед асинхронными операциями.
Часто задаваемые вопросы (FAQ)
1
Что такое микрозадачи и макрозадачи в JavaScript?
Микрозадачи (например, Promise.then) выполняются сразу после текущего синхронного кода, до перехода к следующей макрозадаче. Макрозадачи (например, setTimeout) обрабатываются в отдельных циклах event loop.
2
Как работает requestAnimationFrame в event loop?
requestAnimationFrame выполняется перед отрисовкой кадра в браузере, обычно после микрозадач, но до следующих макрозадач. Его точное время зависит от частоты кадров.
3
Почему Promise.then выполняется раньше setTimeout с нулевой задержкой?
Микрозадачи (Promise) имеют более высокий приоритет в event loop. Они обрабатываются сразу после синхронного кода, в то время как setTimeout, даже с задержкой 0, является макрозадачей и выполняется в следующем цикле.
Типичные ошибки
1
Считать, что requestAnimationFrame блокирует выполнение микрозадач
Микрозадачи выполняются до requestAnimationFrame, так как они обрабатываются в том же цикле event loop, что и синхронный код, а rAF ждёт следующего кадра.
2
Думать, что setTimeout(..., 0) выполняется мгновенно
Даже с нулевой задержкой setTimeout является макрозадачей и выполняется только после всех синхронных операций и микрозадач текущего цикла event loop.
3
Предполагать, что порядок между разными setTimeout или между setTimeout и requestAnimationFrame фиксирован
Относительный порядок выполнения различных асинхронных операций (например, нескольких setTimeout или между setTimeout и rAF) может зависеть от таймингов браузера и не гарантирован.