Promises em JavaScript
Tags: javascript, beginners, braziliandevs
Published: 2023-08-29 11:53:50


Você aprendeu sobre promises no JavaScript? É um assunto que muita gente desiste logo de cara, mas vou tentar descomplicar ao máximo pra você.

## 1. Prólogo

Nunca fui de escrever muito, mas ensinando eu aprendo melhor e de quebra posso ajudar quem estiver começando, como diria o [@guto](https://dev.to/guto) citando um grande filósofo: 
> "Ninguém é tão grande que não possa aprender, nem tão pequeno que não possa ensinar" - Esopo.

Foi um grande desafio tentar colocar em uma explicativa tudo que eu entendo sobre Promises / Async Await, mas espero que você goste!

## 2. Mas que DIABOS é uma "Promise"?

O tal assunto que assusta muitos, porém nem é tão ruim. Promises são ferramentas poderosas que o Javascript possui para lidar com códigos assíncronos.

Uma `Promise` é um objeto usado para processamento assíncrono. Um Promise (de “promessa”) representa um valor que pode estar disponível agora, num futuro ou **nunca**. 
Também pode ser entendido como algo de "consistência eventual". Agora vamos falar dos estados de uma promise:

## 3. **Estados de uma Promise**:

Uma **promise** pode ter três estados:

* **pending:** estado inicial dela, ou seja, está aguardando o fim da execução do código;
* **fulfilled:** quando a operação foi realizada e/ou "resolvida" com sucesso.  
* **rejected:** quando a operação termina com algum erro.

## 4. Como construir uma promise

Para construir nossas promises, podemos usar o constructor `new Promise()` que recebe uma função como parâmetro que recebera dois argumentos, o `resolve` e o `reject`

```js
new Promise((resolve, reject) => {});
```

[...] resolve e reject serão usados para definirmos qual o estado que promise terá quando for finalizada.

* Quando a promise for **resolvida**, usamos a função **resolve**;  
* Quando a promise for **rejeitada**, usamos a função **reject**

### 4.1 Retornando valores quando a promise é resolvida

Vamos criar uma promise e usar a função `setTimeout` para criar um código assíncrono que demora 1000 milissegundos (1 segundo) para ser executado. Além do `setTimeout`, vamos criar também uma função chamada `generateRandomNumber` que gera um número aleatório entre 0 e 10.


```js
//função que gera um número aleatório
const generateRandomNumber = () => Math.round(Math.random() * 10);

const oneSecond = 1000;

// promise resolvida retornando o número aleatório
const resolvedPromiseCallback = () => {
	new Promise((resolve, reject)) {
		setTimeout(() => {
			const randomNumber = generateRandomNumber();
			resolve(randomNumber);
		}, oneSecond);
	}
}
```


Quando a promise `resolvedPromiseCallback` for chamada, ela será finalizada com o estado de resolvida, retornando o número gerado.

### 4.2 Retornando um erro quando a promise é rejeitada

Da mesma forma que podemos retornar um valor quando a promise for resolvida, também podemos retornar um valor quando ela for rejeitada, usando a função `reject`:

```js
//função que gera um número aleatório
const generateRandomNumber = () => Math.round(Math.random() * 10);

const oneSecond = 1000;

// promise resolvida retornando o número aleatório
const resolvedPromiseCallback = () => {
	new Promise((resolve, reject)) {
		setTimeout(() => {
			const randomNumber = generateRandomNumber();
			resolve(randomNumber);
		}, oneSecond);
	}
}

// promise rejeitada retornando um objeto de erro
const rejectedPromiseCallback = () => {
	new Promise((resolve, reject)) {
		setTimeout(() => {
			const randomNumber = generateRandomNumber();
			reject(new Error(`O número ${randomNumber} é invalido.`))
		}, oneSecond);
	}
}
```

## 5. Finalização 

Esses foram meus entendimentos sobre o estudo de promise e do jeito mais didático possível que eu consegui repassar. É um tópico bem extenso, mas eu espero que vocês tenham curtido e façam um bom uso!

Não esqueçam de encher a garrafinha d'agua e até o próximo artigo!

[Twitter](https://twitter.com/muriloazarias_)