Ich habe eine Array-ähnliche Struktur, die asynchrone Methoden verfügbar macht. Die asynchrone Methode ruft Rückgabearraystrukturen auf, die wiederum mehr asynchrone Methoden verfügbar machen. Ich erstelle ein weiteres JSON-Objekt, um die aus dieser Struktur erhaltenen Werte zu speichern. Daher muss ich vorsichtig sein, um Referenzen in Rückrufen zu verfolgen.
Ich habe eine Brute-Force-Lösung codiert, möchte aber eine idiomatischere oder sauberere Lösung lernen.
- Das Muster sollte für n Verschachtelungsebenen wiederholbar sein.
- Ich muss versprechen.all oder eine ähnliche Technik verwenden, um zu bestimmen, wann die einschließende Routine gelöst werden soll.
- Nicht jedes Element erfordert zwangsläufig einen asynchronen Aufruf. In einem verschachtelten Versprechen kann ich meinen JSON-Array-Elementen nicht einfach anhand des Index Zuweisungen vornehmen. Trotzdem muss ich so etwas wie versprechen.all im verschachtelten forEach verwenden, um sicherzustellen, dass alle Eigenschaftszuweisungen vor dem Auflösen der umschließenden Routine vorgenommen wurden.
- Ich benutze das Bluebird-Versprechen lib, aber dies ist keine Voraussetzung
Hier ist ein Teilcode -
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
(gleichzeitige) und Promise.each
(sequentiell) in diesem Fall auch zur Kenntnis Promise.defer
veraltet - der Code in meiner Antwort zeigt , wie es zu vermeiden , indem der Rückkehr verspricht. Bei Versprechungen dreht sich alles um Rückgabewerte.