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 catch
controlador 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 ( 1
y 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.
reject
un valor después de laPromise
funció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 dereject
en primer lugar? ¿Por qué no lanzar un error? Gracias de nuevo,