Я только что закончил читать Обещания / A + спецификации и наткнулся на термины microtask и macrotask: см http://promisesaplus.com/#notes
Я никогда не слышал об этих терминах раньше, и теперь мне любопытно, какая разница?
Я уже пытался найти некоторую информацию в Интернете, но все, что я нашел, - это сообщение из архива w3.org (которое не объясняет мне разницу): http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html
Кроме того, я нашел модуль npm под названием «macrotask»: https://www.npmjs.org/package/macrotask Опять же, не ясно, в чем именно заключается разница.
Все, что я знаю, это то, что он как-то связан с циклом событий, как описано в https://html.spec.whatwg.org/multipage/webappapis.html#task-queue и https: //html.spec.whatwg. .org / многостраничный / webappapis.html # выполнить-а-microtask-пропускной пункт
Я знаю, что теоретически я должен быть в состоянии извлечь различия самостоятельно, учитывая эту спецификацию WHATWG. Но я уверен, что другие могли бы также извлечь выгоду из краткого объяснения, данного экспертом.
источник
while (task = todo.shift()) task();
Ответы:
За один обход цикла событий из очереди макрозадач будет обрабатываться ровно одна задача (эта очередь просто называется очередью задач в спецификации WHATWG ). После завершения этой макрозадачи все доступные микрозадачи будут обработаны, а именно в рамках одного цикла обработки. Пока эти микрозадачи обрабатываются, они могут ставить в очередь еще больше микрозадач, которые будут выполняться одна за другой, пока очередь микрозадач не будет исчерпана.
Каковы практические последствия этого?
Если микрозадача рекурсивно ставит в очередь другие микрозадачи, это может занять много времени, пока следующая макрозадача не будет обработана. Это означает, что в вашем приложении может появиться заблокированный пользовательский интерфейс или несколько завершенных операций ввода-вывода.
Однако, по крайней мере, в отношении функции process.nextTick Node.js (которая ставит в очередь микрозадачи ), существует встроенная защита от такой блокировки с помощью process.maxTickDepth. Для этого значения по умолчанию установлено значение 1000, что сокращает дальнейшую обработку микрозадач после достижения этого предела, что позволяет обрабатывать следующую макрозадачу )
Итак, когда использовать что?
В основном, используйте микрозадачи, когда вам нужно делать что-то асинхронно синхронно (то есть когда вы говорите, что выполняете эту (микро) задачу в ближайшем будущем ). В противном случае, придерживайтесь макрозадач .
Примеры
макрозадачи: setTimeout , setInterval , setImmediate , requestAnimationFrame , I / O ,
микрозадачи рендеринга UI: process.nextTick , Promises , queueMicrotask , MutationObserver
источник
process.maxTickDepth
был удален очень давно: github.com/nodejs/node/blob/…Основные понятия в спецификации :
А модель процесса цикла событий выглядит следующим образом:
когда стек вызовов пуст, выполните следующие действия:
упрощенная модель процесса выглядит следующим образом:
что запомнить
источник
setImmediate()
это макрос / задача иprocess.nextTick()
микро / работа.paint
задач браузера ? В какую категорию они бы вписались?requestAnimationFrame
Я думаю, что мы не можем обсуждать цикл обработки событий при отделении от стека, поэтому:
JS имеет три «стека»:
И цикл обработки событий работает следующим образом:
Стек Mico не будет трогаться, если стек не пуст. Макропакет не будет сенсорным, если микропогрузка не пуста ИЛИ не требует выполнения.
Подводя итог: очередь микрозадач почти такая же, как очередь макрозадач, но эти задачи (process.nextTick, Promises, Object.observe, MutationObserver) имеют более высокий приоритет, чем макрозадачи.
Микро как макро, но с более высоким приоритетом.
Вот вам и «окончательный» код для понимания всего.
источник