Eae gente bonita, beleza? Continuando nossos estudos em JavaScript, dessa vez eu irei falar algo muito interessante que é "e se nós pudessemos colocar coisas na frente da nossa pilha de execução" ou de uma forma mais simples, alterar a ordem de execução das funções do JavaScript, maneiro né? Então hoje vou te passar algumas formas de fazer isso. Recomendo também que leia o post sobre callstack e também sobre pilha.
Tabela de conteúdo
A Callstack
Antes de começarmos a alterar e colocar coisas como prioridade é importante entendermos o que é a callstack e para isso precisamos entender também o que é uma pilha. Tenho artigo explicando os dois eles vão estar no começo e no fim do post. Vamos dar uma passada bem rápida antes de começarmos: bom uma pilha é a exatamente como uma pilha de moedas ou roupas, o primeiro item a entrar é o último a sair e o ultimo a entrar é o primeiro a sair, da mesma forma como empilhamos moedas uma em cima da outra e depois tiramos a primeira de cima e assim por diante. A Callstack não é muito diferente disso porém ao invés de falarmos de moedas estamos falando de funções onde uma função vai chamando a outra.
Como alterar a ordem
Essa parte é de fato a mais simples. Para fazer isso nós temos as seguintes opções: process.nextTick, setImmediate, setTimeout e interval. E todas são executadas da mesma maneira, passando uma função de callback com as instruções que serão executadas.
Abaixo um exemplo:
const Event = require('node:events');
const event = new Event();
const eventName = 'counter';
event.on(eventName, msg => console.log('counter update', msg));
const myCounter = {
counter: 0
};
const proxy = new Proxy(myCounter, {
set: (target, propertyKey, newValue) => {
console.log('proxy', { newValue, key: target[propertyKey] })
event.emit(eventName, { newValue, key: target[propertyKey] })
target[propertyKey] = newValue;
return true;
},
get: (object, prop) => {
// console.log('chamou', { object, prop });
return object[prop];
}
});
setInterval(function () {
proxy.counter +=1
if(proxy.counter === 10) clearInterval(this)
}, 200)
process.nextTick(() => {
proxy.counter = 2;
});
Aqui nós temos um exemplo que usei também para aprender sobre o Proxy o tema do ultimo post, mas vai funciona bem. De forma simples esse exemplo conta de 0 a 10. Porém com a adição do process.nextTick
o contador irá iniciar em 2 e não em 0 pois foi alterada a prioridade de execução.
Ordem de prioridade das funções
Acima eu citei 4 funções que alteram a prioridade na pilha de execução. Porém se ultilizarmos todas juntas existe uma ordem entre elas que será seguida, que é a seguinte:
- process.nextTick
- setImmediate
- setTimeout
- setInterval
É importante dizer que apesar do process.nextTick parecer a melhor função a ser usada, o seu uso não é recomendado sendo uma má prática, pois ela da prioridade total na pilha de execução atrapalhando o ciclo de vida do node.
Referências
Espero que tenha sido claro e tenha ajudado a entender um pouco mais sobre o assunto, fique a vontade para dúvidas e sugestões abaixo!
Se chegou até aqui, me segue la nas redes vizinhas.
Top comments (1)
Hi Cristian Magalhães,
Top, very nice and helpful !
Thanks for sharing.