DEV Community

Cover image for JavaScript: Alterando a prioridade de execução
Cristian Magalhães
Cristian Magalhães

Posted on

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

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;
});

Enter fullscreen mode Exit fullscreen mode

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:

  1. process.nextTick
  2. setImmediate
  3. setTimeout
  4. 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.

thank you dog

Top comments (1)

Collapse
 
jangelodev profile image
João Angelo

Hi Cristian Magalhães,
Top, very nice and helpful !
Thanks for sharing.