Этот вопрос, кажется, возник из-за нескольких недоразумений.
Сначала немного косится волос в номенклатуре, но нет ничего под названием " macro-task ". Только " task " и " microtask " являются частью HTML specs , отвечающими за Циклы событий в браузере.
В этом пункте есть некоторый смысл, поскольку вам необходимо понять, что микротрубы являются обычными задачами , которые выполняются в особый момент в событии -l oop.
Как правило, после каждого выполнения задачи браузер выполняет конечную точку микрозадачи , которая будет проверять наличие ожидающих выполнения микрозадач .
Это единственная разница между микрозадачей и задачей .
Поэтому вопрос о том, выполняется ли что-то в микрозадаче или в задаче, имеет мало смысла. Чтобы заставить что-то работать в микрозадаче , все, что вам нужно, это позвонить из queueMicroTask()
*, но, опять же, это ничего не изменит.
Создание Worker является асинхронным (требуется извлечение сценария ) и, таким образом, охватывает несколько задач, различных процессов и различные циклы событий (хотя они используют одну и ту же модель обработки ).
Так сказать, если он выполняется в микрозадаче ... Синхронная часть может.
queueMicrotask( () => {
// Worker instance is created from a micro-task...
const worker = new Worker('data:application/javascript,const foo="bar";');
} );
Теперь, IMM, самый интересный вопрос в этом вопросе о событии message .
Действительно, мы уже увидел, что у нас есть только задач , однако мы не сказали, что существует несколько очередей задач и, самое главное, все очереди задач не не имеет такого же приоритета!
Существует текущее предложение о предоставлении контроля над этими приоритетами веб-разработчикам, но это все еще предложение.
Я должен признать, что в настоящее время то, что происходит, не всегда является для меня ясной наукой, но в основном источник задач опубликованных сообщений поступает из одной из очередей задач с наивысшим приоритетом, к которому у нас есть доступ до (IIR C после кадров анимации).
Конкретно это означает, что если вы запланируете две асинхронные задачи для одного и того же события l oop, событие сообщения должно победить, даже если оно было вызвано после:
setTimeout( () => console.log( 'timeout' ), 0 );
onmessage = e => console.log( 'message' );
postMessage( '', '*' );
*, который также доступен в Workers, поэтому Promises - не единственный способ запуска микротак в Worker.