Pero esa no parece la forma correcta de hacerlo ...
De hecho, esa es la forma correcta de hacerlo (o al menos una forma correcta de hacerlo). Este es un aspecto clave de las promesas, son una canalización y los datos pueden ser manipulados por los diversos controladores en la canalización.
Ejemplo:
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);
});
(El catchcontrolador se omite por brevedad. En el código de producción, siempre propague la promesa o controle el rechazo).
El resultado que vemos de eso es:
Primer manipulador [1,2]
Segunda mano [10,20]
... porque el primer controlador obtiene la resolución de las dos promesas ( 1y 2) como una matriz, y luego crea una nueva matriz con cada una de ellas multiplicada por 10 y la devuelve. El segundo controlador obtiene lo que devolvió el primer controlador.
Si el trabajo adicional que está haciendo es sincrónico, también puede ponerlo en el primer controlador:
Ejemplo:
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;
});
... pero si es asincrónico, no querrá hacer eso, ya que termina anidando, y la anidación puede salirse de control rápidamente.
rejectun valor después de laPromisefunción inicial ? ¿O arrojar un error en cualquier parte de la cadena lo llevará al.catch()? Si ese es el caso, ¿cuál es el punto derejecten primer lugar? ¿Por qué no lanzar un error? Gracias de nuevo,