JavaScript: Alterando a prioridade de execução
Tags: javascript, braziliandevs, beginners, programming
Published: 2024-07-03 12:13:45

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](https://dev.to/cristuker/javascript-o-que-e-callstack-3358) e também sobre [pilha](https://dev.to/cristuker/estrutura-de-dados-o-que-e-uma-pilha-296p).

## Tabela de conteúdo
* [A Callstack](#a-callstack)
* [Como alterar a ordem](#como-alterar-a-ordem)
* [Ordem de prioridade das funções](#ordem-de-prioridade-das-funcoes)
* [Referências](#referencias)

## 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:

```javascript
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:

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

* [Javascript: O que é Callstack](https://dev.to/cristuker/javascript-o-que-e-callstack-3358)
* [Estrutura de dados: Pilha](https://dev.to/cristuker/estrutura-de-dados-o-que-e-uma-pilha-296p).

-------

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]
(https://cristiansilva.dev/).

<img src="https://media.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" />