Какие стадии жизни есть у таск
Что проверяют
Во фронтенде «таск» почти всегда означает задачу цикла событий, и интервьюер хочет понять, представляете ли вы путь колбэка от постановки в очередь до отрисовки. Следом обычно дают код с setTimeout, Promise.then и queueMicrotask и просят назвать порядок вывода. Если сомневаетесь, что речь о событийном цикле, а не о задаче в трекере, уточните это одной фразой.
Как отвечать
Опишите жизнь задачи по шагам:
- постановка в очередь: источник кладёт задачу в очередь задач. Источниками бывают таймеры, события ввода, ответы сети,
postMessage. УsetTimeoutзадержка минимальная, а не точная: колбэк встанет в очередь не раньше срока; - ожидание: браузер сам выбирает, из какой очереди брать следующую задачу, и ввод пользователя может обогнать таймер;
- выполнение: задача выполняется до конца, прервать её нельзя. Всё, что дольше 50 мс, считается длинной задачей и видно в панели Performance;
- микрозадачи: когда стек опустел, движок выполняет всю очередь микрозадач: реакции промисов,
queueMicrotask,MutationObserver. Микрозадачи, добавленные по ходу, тоже выполняются сразу; - отрисовка: между задачами браузер может, но не обязан, выполнить колбэки
requestAnimationFrame, пересчёт стилей, layout и paint, обычно раз в кадр; - отмена: задачу, которая ещё ждёт, снимают через
clearTimeout, а запрос черезAbortController.
Хорошо добавить, как дробят длинную работу: setTimeout, requestIdleCallback или scheduler.yield(), который поддерживается пока не во всех браузерах. Управление возвращается браузеру между кусками, и интерфейс успевает реагировать на клики.
Где спотыкаются
Путают задачи и микрозадачи. Promise.resolve().then(...) выполнится раньше setTimeout(..., 0), даже если таймер поставлен первым.
Считают, что setTimeout(fn, 0) запускает функцию сразу. Она уйдёт в очередь и дождётся конца текущей задачи и всех микрозадач.
Думают, что браузер перерисовывает страницу после каждой задачи. Бесконечная цепочка микрозадач или тяжёлый синхронный цикл блокирует отрисовку полностью, и страница замерзает без единой ошибки в консоли.