JavaScript: Alterando a prioridade de execução

JavaScript: Alterando a prioridade de execução

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
Como alterar a ordem
Ordem de prioridade das funções
Referências

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

Javascript: O que é Callstack

Estrutura de dados: Pilha.

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.