Acabei de ler a especificação Promises / A + e me deparei com os termos microtask e macrotask: consulte http://promisesaplus.com/#notes
Eu nunca ouvi falar desses termos antes, e agora estou curioso sobre qual poderia ser a diferença?
Eu já tentei encontrar algumas informações na web, mas tudo o que encontrei foi este post dos arquivos do w3.org (o que não explica a diferença para mim): http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html
Além disso, encontrei um módulo npm chamado "macrotask": https://www.npmjs.org/package/macrotask Novamente, não está claro qual é exatamente a diferença.
Tudo o que sei é que ele tem algo a ver com o loop de eventos, conforme descrito em https://html.spec.whatwg.org/multipage/webappapis.html#task-queue e https: //html.spec.whatwg .org / multipage / webappapis.html # perform-a-microtask-checkpoint
Sei que teoricamente deveria conseguir extrair as diferenças pessoalmente, dada essa especificação WHATWG. Mas tenho certeza de que outros também poderiam se beneficiar de uma breve explicação dada por um especialista.
fonte
while (task = todo.shift()) task();
Respostas:
Uma solução geral do loop de eventos terá exatamente uma tarefa sendo processada na fila de macrotask (essa fila é chamada simplesmente de fila de tarefas na especificação WHATWG ). Após o término desta macrotask, todas as microtasks disponíveis serão processadas, ou seja, dentro do mesmo ciclo de execução . Enquanto essas microtasks são processadas, elas podem enfileirar ainda mais microtasks, que serão executadas uma a uma, até que a fila de microtask esteja esgotada.
Quais são as consequências práticas disso?
Se uma microtask enfileirar recursivamente outras microtasks, poderá levar muito tempo até que a próxima macrotask seja processada. Isso significa que você pode acabar com uma interface do usuário bloqueada ou com alguma E / S concluída no seu aplicativo.
No entanto, pelo menos no que diz respeito à função process.nextTick do Node.js. (que enfileira microtarefas ), há uma proteção integrada contra esse bloqueio por meio de process.maxTickDepth. Esse valor é definido como um padrão de 1000, reduzindo o processamento adicional de microtasks depois que esse limite é atingido, permitindo que a próxima macrotask seja processada)
Então, quando usar o que?
Basicamente, use microtarefas quando precisar fazer coisas de forma assíncrona de forma síncrona (ou seja, quando você diria executar essa (micro) tarefa no futuro mais imediato ). Caso contrário, atenha-se às macrotasks .
Exemplos
macrotasks: setTimeout , setInterval , setImmediate , requestAnimationFrame , E / S ,
microtasks de renderização de UI : process.nextTick , Promises , queueMicrotask , MutationObserver
fonte
process.maxTickDepth
foi removido há muito tempo atrás: github.com/nodejs/node/blob/...Conceitos básicos nas especificações :
E o modelo de processo do loop de eventos é o seguinte:
Quando a pilha de chamadas estiver vazia, execute as etapas
Um modelo de processo simplificado é o seguinte:
algo para lembrar:
fonte
setImmediate()
é macro / tarefa eprocess.nextTick()
é um micro / trabalho.paint
tarefas do navegador ? Em qual categoria eles se encaixariam?requestAnimationFrame
)Acho que não podemos discutir o loop de eventos na separação da pilha, então:
JS tem três "pilhas":
E o loop de eventos funciona desta maneira:
A pilha do Mico não será tocada se a pilha não estiver vazia. A pilha de macros não será tocada se a micro pilha não estiver vazia OU não exigir execução.
Resumindo: a fila de microtask é quase a mesma da fila de macrotask, mas essas tarefas (process.nextTick, Promises, Object.observe, MutationObserver) têm prioridade mais alta que as macrotasks.
Micro é como macro, mas com maior prioridade.
Aqui você tem um código "definitivo" para entender tudo.
fonte