javascript - resolver una serie de promesas desde dentro de una promesa de padres
promise bluebird (2)
Esta es mi primera oportunidad de promesas anidadas. Estoy usando la biblioteca bluebird pero creo que la idea es la misma para todas las bibliotecas de promesa.
A un alto nivel, esto es lo que estoy tratando de hacer:
myService.getSomeData(url)
.then((data) => {
myOtherService.getMoreData(data.uniqueId)
.then((thisDataIsAnArray) => {
//loop over the data above and do something
});
});
Se supone que
getMoreData()
realiza llamadas de servicio X y almacena los resultados en una matriz de elementos X largos.
Aquí es donde empiezo a perderme, ya que no estoy seguro de cómo crear este método y qué debería regresar de él.
He hecho algunas puñaladas en
Promise.all
y
Promise.map
bluebird, pero estoy vacilante y pensé en solicitar sugerencias.
La iteración prometida totalmente deformado mi cerebro la primera vez que lo intenté también. Creo que la documentación de Bluebird hace un trabajo bastante pobre al distinguir los casos de uso comunes, pero no continuaré al respecto porque (a) me encanta Bluebird y (b) no tengo tiempo para actualizar los documentos.
Siento que
Promise.map
es lo correcto para su escenario.
myService.getSomeData(url)
.then((data) =>
{
return myOtherService.getMoreData(data.uniqueId)
})
.map((item) =>
{
return doSomethingWithData(item);
})
.then((results) =>
{
// do something with the result array.
});
Dependiendo de lo que quieras hacer con los resultados, donde he usado
.map
también puedes usar
.reduce
o
.each
.
Tenga en cuenta que
.each
no modifica el valor de retorno de la promesa a la que está encadenado, de ahí el comentario de "usar solo para efectos secundarios" en los documentos de Bluebird.
La diferencia entre la instancia y los métodos estáticos es, por supuesto, que con static debe proporcionar la matriz, por ejemplo,
Promise.map(array, (item) => {})
.
Además, como dijo @jib, siempre devuelve un valor dentro de sus devoluciones de llamada. Esto te ahorrará mucho dolor en el futuro.
Las promesas son solo valores de retorno a los que adjunta devoluciones de llamada, en lugar de pasar devoluciones de llamada a funciones. A menos que los devuelva todos, no hay forma de que las devoluciones de llamada se encadenen o capten todos sus errores.
Además, regrese de todos los
.then
el instante en que tenga otra promesa.
Esto aplana las cosas.