JavaScript: Alterando a prioridade de execução

Cristian Magalhães - Jul 3 - - Dev Community

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

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player