Resumo : neste tutorial, você aprenderá como usar o Promise.any()
método JavaScript para redigir promessas.
Introdução ao método JavaScript Promise.any()
O Promise.any()
método aceita uma lista de objetos Promise como um objeto iterável :
Promise.any(iterable);
Linguagem de código: JavaScript ( javascript )
Se uma das promessas no objeto iterável for cumprida, o Promise.any()
retorna uma única promessa que resolve um valor que é o resultado da promessa cumprida:
Neste diagrama:
- O
promise1
resolve para um valorv1
emt1
. - O
promise2
resolve para um valorv2
emt2
. - O
Promise.any()
retorna uma promessa que resolve um valorv1
, que é o resultado depromise1
, emt1
O Promise.any()
retorna uma promessa que é cumprida com qualquer primeira promessa cumprida, mesmo que algumas promessas no objeto iterável sejam rejeitadas:
Neste diagrama:
- O
promise1
é rejeitado com umerror
att1
. - O
promise2
valor é cumpridov2
emt2
. - O
Promise.any()
retorna uma promessa que resolve um valorv2
que é o resultado dopromise2
. Observe que oPromise.any()
método ignora a promessa rejeitada (promise1
).
Se todas as promessas no objeto iterável forem rejeitadas ou se o objeto iterável estiver vazio, o Promise.any()
retorno será uma promessa que rejeita com um AggregateError
contendo todos os motivos de rejeição. A AggregateError
é uma subclasse de Error
.
Neste diagrama:
- O
promise1
é rejeitado por umerror1
att1
. - O
promise2
é rejeitado por umerror2
att2
. - O
Promise.any()
retorna uma promessa que é rejeitada contendo umt2
e de todas as promessas rejeitadas.AggregateError
error1
error2
Exemplos de JavaScript Promise.any()
Vejamos alguns exemplos de uso do Promise.any()
método.
1) Exemplo de todas as promessas cumpridas
O exemplo a seguir demonstra o Promise.any()
método com todas as promessas cumpridas:
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Promise 1 fulfilled');
resolve(1);
}, 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Promise 2 fulfilled');
resolve(2);
}, 2000);
});
const p = Promise.any([p1, p2]);
p.then((value) => {
console.log('Returned Promise');
console.log(value);
});
Linguagem de código: JavaScript ( javascript )
Saída:
Promise 1 fulfilled
Returned Promise
1
Promise 2 fulfilled
Linguagem de código: JavaScript ( javascript )
Como funciona.
- Primeiro, crie uma nova promessa
p1
que será resolvida em um valor1
após um segundo. - Segundo, crie uma nova promessa
p2
que será resolvida em um valor2
após dois segundos. - Terceiro, use o
Promise.any()
método que usa duas promessasp1
ep2
. OPromise.any()
retorna uma promessap
que será resolvida para o valor1
da primeira promessa cumprida (p1
) após um segundo.
2) Um exemplo de promessa rejeitada
O exemplo a seguir usa o Promise.any()
método com uma lista de promessas que possuem uma promessa rejeitada:
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Promise 1 rejected');
reject('error');
}, 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Promise 2 fulfilled');
resolve(2);
}, 2000);
});
const p = Promise.any([p1, p2]);
p.then((value) => {
console.log('Returned Promise');
console.log(value);
});
Linguagem de código: JavaScript ( javascript )
Saída:
Promise 1 rejected
Promise 2 fulfilled
Returned Promise
2
Linguagem de código: JavaScript ( javascript )
Neste exemplo, Promise.any()
ignora a promessa rejeitada. Quando the p2
resolve com o valor 2
, the Promise.any()
retorna uma promessa que resolve com o mesmo valor que o resultado do p2
.
3) Exemplo de todas as promessas rejeitadas
O exemplo a seguir demonstra como usar o Promise.any()
método com todas as promessas rejeitadas:
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Promise 1 rejected');
reject('error1');
}, 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Promise 2 rejected');
reject('error2');
}, 2000);
});
const p = Promise.any([p1, p2]);
p.catch((e) => {
console.log('Returned Promise');
console.log(e, e.errors);
});
Linguagem de código: JavaScript ( javascript )
Saída:
Promise 1 rejected
Promise 2 rejected
Returned Promise
[AggregateError: All promises were rejected] [ 'error1', 'error2' ]
Linguagem de código: JavaScript ( javascript )
Neste exemplo, ambos p1
e p2
foram rejeitados com a string error1
and error2
. Portanto, o Promise.any()
método foi rejeitado com um AggregateError
objeto que possui a errors
propriedade contendo todos os erros das promessas rejeitadas.
Quando usar o método JavaScript Promise.any()
Na prática, você usa o Promise.any()
para retornar a primeira promessa cumprida. Uma vez cumprida uma promessa, o Promise.any()
método não espera que outras promessas sejam concluídas. Em outras palavras, os Promise.any()
curtos-circuitos após o cumprimento de uma promessa.
Por exemplo, você tem um recurso servido por duas ou mais redes de entrega de conteúdo (CDN). Para carregar dinamicamente o primeiro recurso disponível, você pode usar o Promise.any()
método.
O exemplo a seguir usa o Promise.any()
método para buscar duas imagens e exibir a primeira imagem disponível.
O arquivo index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>JavaScript Promise.any() Demo</title>
</head>
<body>
<script src="js/app.js"></script>
</body>
</html>
Linguagem de código: JavaScript ( javascript )
O arquivo app.js
function getImageBlob(url) {
return fetch(url).then((response) => {
if (!response.ok) {
throw new Error(`HTTP status: ${response.status}`);
}
return response.blob();
});
}
let cat = getImageBlob(
'https://upload.wikimedia.org/wikipedia/commons/4/43/Siberian_black_tabby_blotched_cat_03.jpg'
);
let dog = getImageBlob(
'https://upload.wikimedia.org/wikipedia/commons/a/af/Golden_retriever_eating_pigs_foot.jpg'
);
Promise.any([cat, dog])
.then((data) => {
let objectURL = URL.createObjectURL(data);
let image = document.createElement('img');
image.src = objectURL;
document.body.appendChild(image);
})
.catch((e) => {
console.log(e.message);
});
Linguagem de código: JavaScript ( javascript )
Como funciona.
- Primeiro, defina a
getImageBlob()
função que usa a API fetch para obter o blob da imagem de uma URL. OgetImageBlob()
retorna umPromise
objeto que resolve o blob de imagem. - Segundo, defina duas promessas que carregam as imagens.
- Terceiro, mostre a primeira imagem disponível usando o
Promise.any()
método.
Resumo
- Use o método JavaScript
Promise.any()
para obter uma lista de promessas e retornar uma promessa que seja cumprida primeiro.