[Javascript] Melhore o seu uso de Promise: Promise.all x Promise.allSettled
Você sabia que é possível deixar o código abaixo 2x mais rápido?
async function buscarDados() {
const pessoas = await buscarPessoas();
const produtos = await buscarProdutos();
}
O código acima vai ser executado sequencialmente, primeiro o buscarPessoas()
e depois o buscarProdutos()
. Perceba que por ambas as funções serem promises
e não são dependentes uma da outra, podemos executá-las em paralelo. Logo, podemos reescrever o código da seguinte maneira.
async function buscarDados() {
const [pessoas, produtos] = await Promise.all([buscarPessoas(), buscarProdutos()]);
}
Com o código acima, as funções buscarPessoas()
e buscarProdutos()
são executadas em paralelo, melhorando bastante o tempo total de execução da função buscarDados()
.
Mas agora fica a pergunta: e se alguma das funções lançar uma exceção? Bem, podemos fazer o uso do bloco try/catch
para capturar a exceção e fazer o tratamento desejado. Veja o código abaixo.
async function buscarDados() {
try {
const [pessoas, produtos] = await Promise.all([buscarPessoas(), buscarProdutos()]);
} catch (erro) {
tratarErro(erro);
}
}
Tudo lindo, certo? Bem, não. Perceba que o erro vai ser capturado caso qualquer uma das funções buscarPessoas()
ou buscarProdutos()
lance alguma exceção, mas ambas podem lançar uma exceção e em tempos diferentes (lembre-se que estão executando em paralelo), logo apenas uma das exceções vai ser caputarada.
Para solucionar esse problema, podemos utiliza Promise.allSettled
. Veja a seguir.
async function buscarDados() {
const [pessoasResultado, produtosResultado] = await Promise.allSettled([buscarPessoas(), buscarProdutos()]);
}
Utilizando o allSettled
o resultado é um objeto e dentro desse objeto vai ter a propriedade status
, ao qual podemos utilizar para verificar se ocorreu algum erro ou não. Por isso o bloco try/catch
foi removido.
A propriedade status
pode ter um dos seguintes valores: fullfilled
ou rejected
. Com base nesses valores podemos realizar o tratamento da exceção para cada ocorrência.
async function buscarDados() {
const [pessoasResultado, produtosResultado] = await Promise.allSettled([buscarPessoas(), buscarProdutos()]);
if (pessoasResultado.status === 'rejected') {
// tratar erro
}
if (productosResultado.status === 'rejected') {
// tratar erro
}
}