2017-12-18 8 views
0

Ich könnte Dinge in der asynchronen Hölle vermasseln, in der ich mich gerade befinde, und nach dem Debuggen für einen halben Tag gerne jede Hilfe nehmen.Wie bekomme ich den letzten Prozess von async forEach?

Die Aufgabe besteht darin, eine Reihe von Entitäten in der Datenbank asynchron zu aktualisieren. Es ist:

  1. Ruft eine Liste von Entitäten vom Typ Foo
  2. für jedes dieser Elemente aktualisieren es in der Datenbank
  3. SELECT Einheiten vom Typ Bar mit entsprechenden Bedingungen und aktualisieren sie entsprechend
  4. Schließlich Updates ein Array von Objekten der Form [{entity: 'Foo || Bar', id: foo.id || bar.id}]

Was ich zur Zeit haben, ist die folgende (mit Drossel Promise.map):

Dies funktioniert natürlich nicht, da der letzte .then-Block aufgerufen wird, bevor die anderen fertig sind.

Aber ich kann nicht herausfinden, wo und wie kann ich springen, um die Antwort auf den Client genau nach jedes Update wurde abgeschlossen? Der Index, den ich in Promise.map(arrayOfFoos, function(foo, index) bekomme, ist während der Verarbeitung völlig durcheinander, so dass ich mich nicht darauf verlassen kann, die Antwort zu senden, wenn index gleich arrayOfFoos.length ist.

Und da es sehr viele Entitäten geben könnte, die in diesem Prozess aktualisiert werden, möchte ich dies nicht synchron so weit wie ich vermeiden kann, um das Backend während des Prozesses nicht zu blockieren.

Vielen Dank im Voraus!


Mit freundlichen Grüßen,

Vegaaaa

+1

Sie müssen 'das Versprechen von der Callback-Funktion return' so dass' map' warten kann es – Bergi

Antwort

2

Sie sind nicht die Versprechen Kette von fooLib.update() erstellt zurück. Ihr Promise.map() iteriert durch alle Elemente im Array, ruft den Rückruf auf und setzt die .then() auf Ihrem Promise.map() sofort fort, anstatt auf alle Promise-Ketten zu warten, die von jedem der fooLib.update()-Aufrufe erstellt wurden.

Wenn Sie mit Promises arbeiten und jedes interne Promise erstellt wird, müssen Sie jedes davon zurückgeben, um sicherzustellen, dass die Promise-Kette für alle asynchronen Arbeiten vollständig abgewartet wird, wenn dies für Ihren Code erforderlich ist.

Promise.map(arrayOfFoos, function(foo, index){ 
    var fooId = foo.id; 
    return fooLib.update(foo, fooId) 
    .then(function (updatedFoo){ 
     return barLib.update(foo, projectId); 
    }); 
    }) 
+0

Eigentlich müssen Sie die 'fooLib.update() zurückzukehren. Dann()' Versprechen, nicht nur die 'fooLib.update()' versprechen. – Bergi

+0

@Bergi Ich habe meine Antwort aktualisiert, um zu sagen, dass die Versprechenskette, die von 'fooLib.update()' erstellt wurde, zurückgegeben werden muss. – peteb

+0

Ich bin mir ziemlich sicher, dass dies das erste war, was ich getan habe, da ich es gewohnt bin, meine Versprechen zurückzugeben, aber ich habe irgendwie nie den .den Block der Promise.map() erreicht. Aber ich könnte Dinge durcheinander bringen, nachdem ich 4 Stunden lang in dieser Hauptrolle gespielt habe. Ich werde es morgen überprüfen, ich bin jetzt nach Hause gegangen. – Vegaaaa

Verwandte Themen