Tengo una estructura similar a una matriz que expone métodos asincrónicos. Las llamadas al método asíncrono devuelven estructuras de matriz que, a su vez, exponen más métodos asíncronos. Estoy creando otro objeto JSON para almacenar valores obtenidos de esta estructura, por lo que debo tener cuidado al realizar un seguimiento de las referencias en las devoluciones de llamada.
He codificado una solución de fuerza bruta, pero me gustaría aprender una solución más idiomática o limpia.
- El patrón debe ser repetible para n niveles de anidamiento.
- Necesito usar promise.all o alguna técnica similar para determinar cuándo resolver la rutina adjunta.
- No todos los elementos implicarán necesariamente realizar una llamada asíncrona. Entonces, en una promesa anidada, no puedo simplemente hacer asignaciones a los elementos de mi matriz JSON en función de index. Sin embargo, necesito usar algo como promise.all en el forEach anidado para asegurarme de que todas las asignaciones de propiedades se hayan realizado antes de resolver la rutina adjunta.
- Estoy usando la biblioteca de promesa bluebird pero esto no es un requisito
Aquí hay un código parcial:
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
Promise.map
(concurrente) y Promise.each
(secuencial) en este caso, también tenga en cuenta que Promise.defer
está obsoleto: el código en mi respuesta muestra cómo evitarlo devolviendo promesas. Las promesas tienen que ver con los valores de retorno.