A versão 0.10 do Node.js. foi lançada hoje e apresentada setImmediate
. A documentação de alterações da API sugere usá-lo ao fazer nextTick
chamadas recursivas .
Pelo que a MDN diz , parece muito semelhante process.nextTick
.
Quando devo usar nextTick
e quando devo usar setImmediate
?
javascript
node.js
setimmediate
Benjamin Gruenbaum
fonte
fonte
nextTick
mais rápido do quesetImmediate
em grandes cálculos.setImmediate
faz com mais detalhes.setImmediate
, mas não antesnextTick
?Respostas:
Use
setImmediate
se você deseja enfileirar a função atrás de qualquer retorno de chamada de evento de E / S que já esteja na fila de eventos. Useprocess.nextTick
para enfileirar efetivamente a função no início da fila de eventos, para que ela seja executada imediatamente após a conclusão da função atual.Portanto, em um caso em que você está tentando interromper um trabalho de longa duração, vinculado à CPU usando recursão, agora deseja usar, em
setImmediate
vez deprocess.nextTick
enfileirar a próxima iteração, caso contrário, qualquer retorno de chamada de evento de E / S não teria a chance para executar entre iterações.fonte
requestAnimationFrame
porque nem sempre ocorre (eu definitivamente vi isso, acho que o exemplo era guia não era guia atual) e pode ser chamado antes que a página conclua a pintura (ou seja, o navegador ainda está ocupado desenhando).Como uma ilustração
dará a seguinte saída
Espero que isso ajude a entender a diferença.
Atualizada:
fonte
For example, if we run the following script which is not within an I/O cycle (i.e. the main module), the order in which the two timers are executed is non-deterministic, as it is bound by the performance of the process:
Portanto, esta resposta não responde exatamente a diferença exata, mas apenas um exemplo que pode variar em diferentes contextosEu acho que posso ilustrar isso muito bem. Como
nextTick
é chamado no final da operação atual, chamá-lo recursivamente pode acabar impedindo a continuidade do loop de eventos.setImmediate
resolve isso disparando na fase de verificação do loop de eventos, permitindo que o loop de eventos continue normalmente.fonte: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Observe que a fase de verificação ocorre imediatamente após a fase de votação. Isso ocorre porque a fase de pesquisa e os retornos de chamada de E / S são os locais mais prováveis para os quais suas chamadas
setImmediate
serão executadas. Portanto, idealmente, a maioria dessas chamadas será realmente imediata, mas não tão imediata quanto anextTick
que é verificada após cada operação e existe tecnicamente fora do loop de eventos.Vamos dar uma olhada em um pequeno exemplo da diferença entre
setImmediate
eprocess.nextTick
:Digamos que acabamos de executar este programa e estamos avançando na primeira iteração do loop de eventos. Ele chamará a
step
função com a iteração zero. Em seguida, ele registrará dois manipuladores, um parasetImmediate
e outro paraprocess.nextTick
. Em seguida, chamamos recursivamente essa função dosetImmediate
manipulador que será executado na próxima fase de verificação. OnextTick
manipulador será executado no final da operação atual, interrompendo o loop de eventos; portanto, mesmo que tenha sido registrado em segundo, ele será executado primeiro.A ordem acaba sendo:
nextTick
dispara quando a operação atual termina, o próximo loop de evento começa, as fases normais do loop de evento são executadas,setImmediate
dispara e chama recursivamente nossastep
função para iniciar o processo novamente. A operação atual termina,nextTick
dispara, etc.A saída do código acima seria:
Agora vamos passar nossa chamada recursiva para
step
nossonextTick
manipulador, em vez desetImmediate
.Agora que transferimos a chamada recursiva para
step
onextTick
manipulador, as coisas se comportarão em uma ordem diferente. Nossa primeira iteração do loop de eventos é executada e chama ostep
registro de umsetImmedaite
manipulador e de umnextTick
manipulador. Após o término da operação atual, nossonextTick
manipulador é acionado, o que chamastep
e registra recursivamente outrosetImmediate
manipulador e outronextTick
manipulador. Como umnextTick
manipulador é acionado após a operação atual, o registro de umnextTick
manipulador em umnextTick
manipulador fará com que o segundo manipulador seja executado imediatamente após o término da operação do manipulador atual. OsnextTick
manipuladores continuarão disparando, impedindo que o loop de eventos atual continue. Vamos passar por todo o nossonextTick
manipuladores antes de vermos um únicosetImmediate
acionador disparar.A saída do código acima acaba sendo:
Observe que, se não tivéssemos interrompido a chamada recursiva e a abortado após 10 iterações, as
nextTick
chamadas continuariam recorrendo e nunca deixando o loop de eventos continuar para a próxima fase. É assim quenextTick
pode ser bloqueado quando usado recursivamente, enquantosetImmediate
dispara no próximo loop de eventos e definir outrosetImmediate
manipulador de dentro de um não interrompe o loop de eventos atual, permitindo que continue executando as fases do loop de eventos normalmente.Espero que ajude!
PS - Eu concordo com outros comentaristas que os nomes das duas funções poderiam ser facilmente trocados, pois
nextTick
parece que isso será acionado no próximo loop de eventos, em vez do final do atual, e o final do atual é mais "imediato" "que o início do próximo loop. Bem, é isso que obtemos à medida que a API amadurece e as pessoas dependem das interfaces existentes.fonte
Nos comentários da resposta, não afirma explicitamente que o nextTick passou de Macrosemantics para Microsemantics.
antes do nó 0.9 (quando setImmediate foi introduzido), nextTick operava no início da próxima pilha de chamadas.
desde o nó 0.9, nextTick opera no final do pilha de chamadas existente, enquanto setImmediate está no início da próxima pilha de chamadas
confira https://github.com/YuzuJS/setImmediate para obter ferramentas e detalhes
fonte
Em termos simples, process.NextTick () seria executado no próximo tick do loop de eventos. No entanto, o setImmediate basicamente possui uma fase separada que garante que o retorno de chamada registrado em setImmediate () seja chamado somente após a fase de retorno de chamada e pesquisa de opinião.
Consulte este link para obter uma boa explicação: https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and -its-metrics-c4907b19da4c
fonte
Algumas ótimas respostas aqui detalhando como os dois funcionam.
Basta adicionar um que responda à pergunta específica:
Sempre use
setImmediate
.O loop de eventos, timers e
process.nextTick()
documentos do Node.js. inclui o seguinte:No início do documento, ele adverte que
process.nextTick
pode levar a ...Como se vê,
process.nextTick
pode até morrer de fomePromises
:Por outro lado,
setImmediate
é " mais fácil de raciocinar " e evita esses tipos de problemas:Portanto, a menos que haja uma necessidade específica do comportamento exclusivo de
process.nextTick
, a abordagem recomendada é " usarsetImmediate()
em todos os casos ".fonte
Eu recomendo que você verifique a seção de documentos dedicada ao Loop para entender melhor. Alguns trechos retirados de lá:
Temos duas chamadas semelhantes para os usuários, mas seus nomes são confusos.
process.nextTick () é acionado imediatamente na mesma fase
setImmediate () é acionado na seguinte iteração ou 'tick' do
loop de eventos
Em essência, os nomes devem ser trocados. process.nextTick () é acionado mais imediatamente que setImmediate (), mas é um artefato do passado que dificilmente será alterado.
fonte