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,resolve
ereject
. Ao manipular , se o processamento falhar, você de fato lança uma exceção para acionar o caminho da falha. E sim, você também pode lançar uma exceção doPromise
retorno de chamada original (em vez de usarreject
), mas nem todas as falhas são exceções.Hoje o NodeJS suporta uma nova
async/await
sintaxe. Esta é uma sintaxe fácil e torna a vida muito mais fácilSaber mais:
fonte
Sua
return data
abordagem está correta, esse é um exemplo de encadeamento de promessas . Se você retornar uma promessa de seu.then()
retorno de chamada, o JavaScript resolverá essa promessa e passará os dados para o próximothen()
retorno de chamada.Apenas tome cuidado e certifique-se de lidar com os erros
.catch()
.Promise.all()
rejeita assim que uma das promessas na matriz rejeita .fonte