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();
javascript
node.js
asynchronous
promise
user3205931
quelle
quelle
Promise.map
(gleichzeitige) undPromise.each
(sequentiell) in diesem Fall auch zur KenntnisPromise.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.Antworten:
Es ist ziemlich einfach mit einigen einfachen Regeln:
then
, geben Sie es zurück - auf jedes Versprechen, das Sie nicht zurückgeben, wird nicht draußen gewartet..all
diese - auf diese Weise werden alle Versprechen gewartet und kein Fehler von ihnen zum Schweigen gebracht.then
s nisten , können Sie normalerweise in der Mitte zurückkehren -then
Ketten sind normalerweise höchstens 1 Ebene tief.Und einige Tipps:
.map
als mitfor/push
- Wenn Sie Werte mit einer Funktionmap
zuordnen , können Sie den Gedanken, Aktionen einzeln anzuwenden und die Ergebnisse zu aggregieren, präzise ausdrücken.Promise.all
als Dinge nacheinander auszuführen - jede wartet vor der nächsten.Ok, also fangen wir an:
quelle
Hier ist ein einfaches Beispiel mit Reduzieren. Es wird seriell ausgeführt, behält die Einfügereihenfolge bei und erfordert kein Bluebird.
Und benutze es so:
Wir haben es nützlich gefunden, einen optionalen Kontext in eine Schleife zu senden. Der Kontext ist optional und wird von allen Iterationen gemeinsam genutzt.
Ihre Versprechen-Funktion würde folgendermaßen aussehen:
quelle
Ich hatte die gleiche Situation durchgemacht. Ich habe mit zwei Promise.All () gelöst.
Ich denke, es war eine wirklich gute Lösung, also habe ich sie auf npm veröffentlicht: https://www.npmjs.com/package/promise-foreach
Ich denke, Ihr Code wird so etwas sein
quelle
Um die vorgestellte Lösung zu ergänzen, wollte ich in meinem Fall mehrere Daten aus Firebase abrufen, um eine Liste der Produkte zu erhalten. So habe ich es gemacht:
quelle