Eu tenho uma estrutura parecida com uma matriz que expõe métodos assíncronos. As chamadas de método assíncrono retornam estruturas de matriz que, por sua vez, expõem mais métodos assíncronos. Estou criando outro objeto JSON para armazenar valores obtidos dessa estrutura e, portanto, preciso ter cuidado ao manter o controle de referências em retornos de chamada.
Codifiquei uma solução de força bruta, mas gostaria de aprender uma solução mais idiomática ou limpa.
- O padrão deve ser repetido para n níveis de aninhamento.
- Preciso usar a promessa.all ou alguma técnica semelhante para determinar quando resolver a rotina de fechamento.
- Nem todo elemento envolverá necessariamente fazer uma chamada assíncrona. Portanto, em uma promessa aninhada. Tudo que eu não posso simplesmente fazer atribuições aos meus elementos do array JSON com base no índice. No entanto, preciso usar algo como promessa.all no forEach aninhado para garantir que todas as atribuições de propriedade tenham sido feitas antes de resolver a rotina de fechamento.
- Estou usando a lib de promessa do bluebird, mas isso não é um requisito
Aqui está um 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
(simultâneo) e Promise.each
(sequencial) neste caso, também observe que Promise.defer
está obsoleto - o código em minha resposta mostra como evitá-lo retornando promessas. As promessas têm tudo a ver com valores de retorno.