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,resolve
yreject
. Cuando está manejando , si su procesamiento falla, de hecho lanza una excepción para activar la ruta de falla. Y sí, también puede lanzar una excepción de laPromise
devolución de llamada original (en lugar de usarreject
), pero no todas las fallas son excepciones.Hoy, NodeJS admite una nueva
async/await
sintaxis. Esta es una sintaxis fácil y hace la vida mucho más fácil.Aprende más:
fuente
Su
return data
enfoque es correcto, ese es un ejemplo de encadenamiento de promesas . Si devuelve una promesa de su.then()
devolución de llamada, JavaScript resolverá esa promesa y pasará los datos a la siguientethen()
devolución de llamada.Solo tenga cuidado y asegúrese de manejar los errores con
.catch()
.Promise.all()
rechaza tan pronto como una de las promesas de la matriz rechaza .fuente