Mas essa não parece ser a maneira correta de fazer isso.
Essa é realmente a maneira correta de fazer isso (ou pelo menos uma maneira adequada de fazê-lo). Esse é um aspecto fundamental das promessas, elas são um pipeline e os dados podem ser manipulados pelos vários manipuladores no pipeline.
Exemplo:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});
( catch
manipulador omitido por questões de brevidade. No código de produção, sempre propague a promessa ou lide com a rejeição.)
O resultado que vemos é:
Primeiro manipulador [1,2]
Segundo manipulador [10,20]
... porque o primeiro manipulador obtém a resolução das duas promessas ( 1
e 2
) como uma matriz e, em seguida, cria uma nova matriz com cada uma delas multiplicada por 10 e a retorna. O segundo manipulador obtém o que o primeiro manipulador retornou.
Se o trabalho adicional que você está fazendo for síncrono, você também pode colocá-lo no primeiro manipulador:
Exemplo:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});
... mas se for assíncrono, você não vai querer fazer isso, pois acaba sendo aninhado, e o aninhamento pode rapidamente sair do controle.
reject
um valor após aPromise
função inicial ? Ou um erro em qualquer lugar da cadeia o levará ao.catch()
? Se for esse o caso, qual é o sentido dereject
em primeiro lugar? Por que não apenas lançar o erro? Obrigado mais uma vez,