javascript promise bluebird

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.