Bluebird Promise serielle Iteration, und zu modifizierten Array auflösen?

8

Ich habe dieses Versprechen, das ein neues Item -Dokument erstellt, wenn es nicht in der db gefunden wird, und speichert es dann in einem zuvor erstellten Collection -Dokument ..

Das Sammlungsdokument ist die erste Zeichenfolge in einem Array, und jeder nachfolgende Index im Array wird in eine oder mehrere Artikeldokumente übersetzt.

Promise.each "Löst das ursprüngliche Array unmodifiziert" und so macht das letzte return in Promise.each die Objekte rendern, aber das nachfolgende .then erzeugt das ursprüngliche Array ..

Hier ist das Versprechen (abgekürzt für Lesbarkeit):

%Vor%

Und hier ist der letzte console.log in Promise.each:

%Vor%

Und dann nach dem folgenden .then(function(allItems) { ist hier der letzte console.log :

%Vor%

Auch die Variable itemSeries , die = Promise.each später rendert undefined in einer Promise.join?

    
Stacks 26.02.2015, 07:12
quelle

2 Antworten

20

Die Funktion .each ändert nicht den Wert, der über die Kette übergeben wurde :

Ich habe Ihren Code vereinfacht, als Eingabe nehme ich an:

%Vor%

Für Ihren Code:

%Vor%

Das Ergebnis ist weiterhin ['one','two'] , da dies aufgelöste Werte des Arrays items sind. Der zurückgegebene Wert in jedem einzelnen hat keinen Einfluss auf den Inhalt des Wertes, der an die verkettete then übergeben wird.

Die Funktion .map hat dagegen folgenden Effekt:

%Vor%

Hier wird der Wert return verwendet, um ein neues Array zu erstellen, das dann an then übergeben wird. Hier wäre das Ergebnis ['one.','two.'] .

Die zwei allItems , die in Ihrem Code erscheinen, sind verschiedene Objekte.

BEARBEITEN Für die serielle Iteration mit Mapping würde ich eine Hilfsfunktion wie folgt schreiben:

%Vor%

Quelle: Implementieren Sie Promise.series

    
t.niese 26.02.2015, 07:52
quelle
1

Bluebird implementiert nun nativ ein mapSeries , siehe Ссылка

Es sieht auch so aus, als ob Promise.each das ursprüngliche Array leider in v3.x.x zurückgibt.

    
Adam Reis 14.12.2016 20:54
quelle