Ho una struttura simile a un array che espone metodi asincroni. Il metodo asincrono chiama strutture di matrice di ritorno che a loro volta espongono più metodi asincroni. Sto creando un altro oggetto JSON per memorizzare i valori ottenuti da questa struttura e quindi devo stare attento a tenere traccia dei riferimenti nei callback.
Ho codificato una soluzione per la forza bruta, ma vorrei imparare una soluzione più idiomatica o pulita.
- Il modello dovrebbe essere ripetibile per n livelli di nidificazione.
- Ho bisogno di usare promise.all o una tecnica simile per determinare quando risolvere la routine di chiusura.
- Non tutti gli elementi implicheranno necessariamente l'esecuzione di una chiamata asincrona. Quindi, in una promessa annidata, non posso semplicemente fare assegnazioni ai miei elementi dell'array JSON in base all'indice. Tuttavia, ho bisogno di usare qualcosa come promise.all in forEach annidato per assicurarmi che tutte le assegnazioni di proprietà siano state fatte prima di risolvere la routine di inclusione.
- Sto usando bluebird promise lib ma questo non è un requisito
Ecco un po 'di codice parziale -
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
(simultaneo) e Promise.each
(sequenziale) in questo caso, anche la nota Promise.defer
è deprecata: il codice nella mia risposta mostra come evitarlo restituendo promesse. Le promesse riguardano tutti i valori di ritorno.