JavaScript Assincronia Intermediário
Promises
Uma Promise é um objeto que representa a conclusão (ou falha) de uma operação assíncrona. Ela tem três estados possíveis: pending (pendente), fulfilled (resolvida) e rejected (rejeitada). Uma vez que a promise é resolvida ou rejeitada, seu estado não muda mais.
Para consumir o resultado de uma promise, usamos os métodos .then() e .catch(). O .then() recebe uma função de callback que é executada quando a promise é resolvida, enquanto o .catch() trata erros (promise rejeitada). Esses métodos retornam uma nova promise, permitindo o encadeamento de operações assíncronas de forma sequencial.
Quando precisamos executar várias promises em paralelo, usamos Promise.all() ou Promise.allSettled(). O Promise.all() aguarda que todas sejam resolvidas e retorna um array com os resultados; se qualquer uma for rejeitada, ele rejeita imediatamente. Já o Promise.allSettled() aguarda que todas terminem (resolvidas ou rejeitadas) e retorna um array de objetos descrevendo o resultado de cada uma.
Pontos-chave
- Uma promise pode estar pendente, resolvida ou rejeitada; uma vez resolvida/rejeitada, não muda mais.
.then()e.catch()registram callbacks para lidar com o resultado ou erro.- O encadeamento de
.then()permite executar operações assíncronas em sequência. Promise.all()falha rápido se qualquer promise for rejeitada;Promise.allSettled()sempre espera todas terminarem.- Use
Promise.allSettled()quando você quer todos os resultados, mesmo que alguns falhem.
// Exemplo de uso de Promises em JavaScript
// Função que simula uma requisição assíncrona
function buscarDados(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id > 0) {
resolve({ id, nome: `Item ${id}` });
} else {
reject(new Error('ID inválido'));
}
}, 1000);
});
}
// Encadeamento e tratamento de erro
buscarDados(1)
.then(dados => {
console.log('Dados recebidos:', dados);
return buscarDados(2); // encadeia outra promise
})
.then(dados2 => {
console.log('Segundo dado:', dados2);
})
.catch(erro => {
console.error('Erro:', erro.message);
});
// Promise.all: executa várias em paralelo e falha se qualquer uma falhar
Promise.all([buscarDados(3), buscarDados(4)])
.then(resultados => {
console.log('Promise.all resultados:', resultados);
})
.catch(erro => {
console.error('Promise.all erro:', erro.message);
});
// Promise.allSettled: aguarda todas, independente de sucesso ou falha
Promise.allSettled([buscarDados(5), buscarDados(-1)])
.then(resultados => {
console.log('Promise.allSettled:', resultados);
});