Funções Promise.all, Promise.allSettled, Promise.any e Promise.race - JavaScript
As funções Promise.all
Promise.allSettled
Promise.any
Promise.race
Função Promise.all
A função Promise.all
Vamos analisar o seguinte código:
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "Hello");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "World");
});
promise1.then(value => console.log(value)); // Hello
promise2.then(value => console.log(value)); // World
Aqui, definimos duas promises. A operação assíncrona da primeira promise é executada após 1000 milissegundos, enquanto a ação da segunda promise é executada após 500 milissegundos. Ambas as promises são executadas independentemente uma da outra. A saída no console é:
Hello World
A função Promise.all()
Promise.all([promise1, promise2, ...promiseN]);
O resultado retornado pela função é um novo objeto Promise
Agora, vamos alterar o exemplo anterior usando a função Promise.all()
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "Hello");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "World");
});
Promise.all([promise1, promise2])
.then(values => {
const [promise1data, promise2data] = values;
console.log(promise1data, promise2data); // Hello World
});
Agora, os dados de ambas as promises são retornados juntos e estão disponíveis no método then()
Hello World
Os valores de todas as promises são retornados somente se todas forem concluídas com sucesso. No entanto, se uma operação assíncrona de pelo menos uma promise falhar devido à lógica interna ou ao chamar a função reject()
rejected
const promise1 = new Promise((resolve, reject) => {
reject("Erro inesperado");
setTimeout(resolve, 500, "Hello");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "World");
});
Promise.all([promise1, promise2])
.then(values => {
const [promise1data, promise2data] = values;
console.log(promise1data, promise2data);
})
.catch(error => console.log(error)); // Erro inesperado
Neste caso, explicitamente colocamos a primeira promise no estado de rejeição (rejected
Promise.all()
catch()
Promise.allSettled
Outra função é a Promise.allSettled()
Promise.all()
const promise1 = new Promise((resolve, reject) => {
reject("Erro inesperado");
setTimeout(resolve, 500, "Hello");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "World");
});
Promise.allSettled([promise1, promise2])
.then(values => {
const [promise1data, promise2data] = values;
console.log(promise1data); // {status: "rejected", reason: "Erro inesperado"}
console.log(promise2data); // {status: "fulfilled", value: "World"}
});
Quando ocorre um erro em uma das promises (como no exemplo acima com a primeira promise), a função ainda passa os resultados para o método then()
status
rejected
fulfilled
value
Promise.race
A função Promise.race()
const promise1 = new Promise((resolve) => {
setTimeout(resolve, 500, "Hello");
});
const promise2 = new Promise((resolve) => {
setTimeout(resolve, 1000, "World");
});
Promise.race([promise1, promise2])
.then(value => console.log(value)) // Hello
.catch(error => console.log(error));
Neste caso, a primeira promise concluída será a promise1
then(value => console.log(value))
Promise.any
A função Promise.any()
const promise1 = new Promise((resolve, reject) => {
reject("erro na promise1");
setTimeout(resolve, 500, "Hello");
});
const promise2 = new Promise((resolve) => {
setTimeout(resolve, 1000, "World");
});
Promise.any([promise1, promise2])
.then(value => console.log(value)) // World
.catch(error => console.log(error));
Neste caso, a primeira promise concluída será a promise1
then(value => console.log(value))
promise2
Pode parecer que Promise.any()
Promise.race()
Promise.race()
Promise.any()
AggregateError
const promise1 = new Promise((resolve, reject) => {
reject("erro na promise1");
setTimeout(resolve, 500, "Hello");
});
const promise2 = new Promise((resolve, reject) => {
reject("erro na promise2");
setTimeout(resolve, 1000, "World");
});
Promise.any([promise1, promise2])
.then(value => console.log(value))
.catch(error => console.log(error)); // AggregateError: All promises were rejected
Com a propriedade errors do tipo AggregateError
const promise1 = new Promise((resolve, reject) => {
reject("erro na promise1");
setTimeout(resolve, 500, "Hello");
});
const promise2 = new Promise((resolve, reject) => {
reject("erro na promise2");
setTimeout(resolve, 1000, "World");
});
Promise.any([promise1, promise2])
.then(value => console.log(value))
.catch(e => console.log(e.errors)); // ["erro na promise1", "erro na promise2"]