in nodejs, wie man eine FOR-Schleife stoppt, bis der mongodb-Aufruf zurückkommt

8

Bitte sehen Sie sich das unten stehende Code-Snippet an. Ich habe ein Array von JSON-Objekten namens 'stuObjList'. Ich möchte eine Schleife durch das Array machen, um bestimmte JSON-Objekte mit einem bestimmten Flag zu finden, und dann einen DB-Aufruf machen, um mehr Daten zu erhalten.

Natürlich wartet die FOR-Schleife nicht darauf, dass der db-Aufruf zurückkehrt und das Ende von j == length erreicht. Und wenn der db-Aufruf zurückkehrt, ist der Index 'j' außerhalb des Array-Index. Ich verstehe, wie node.js funktioniert und das ist das erwartete Verhalten.

Meine Frage ist: Was ist die Arbeit hier? Wie kann ich erreichen, was ich erreichen möchte? Danke, --u

%Vor%     
Silent User 24.05.2012, 03:00
quelle

4 Antworten

8

" async " ist ein sehr beliebtes Modul, um asynchrone Schleifen zu abstrahieren und Ihren Code einfacher zu lesen / zu warten. Zum Beispiel:

%Vor%

So könnte man es so benutzen:

%Vor%

Beachten Sie, dass .forEach () Ihre Iterator-Funktion für jedes Element in stuObjList "parallel" aufruft (dh es wird nicht darauf warten, dass eine Iterator-Funktion für ein Array-Element vor dem Aufruf des nächsten Array-Elements aufgerufen wird). Das bedeutet, dass Sie nicht wirklich vorhersagen können, in welcher Reihenfolge der Iterator - oder wichtiger, die Datenbankaufrufe - ausgeführt wird. Endergebnis: unvorhersehbare Reihenfolge der Ehre Studenten. Wenn die Reihenfolge von Bedeutung ist, verwenden Sie die Funktion .forEachSeries () .

    
Clint Harris 24.05.2012, 12:26
quelle
1

Ah die Schönheit und Frustration des asynchronen Denkens. Versuchen Sie Folgendes:

%Vor%

Wenn Sie feststellen, dass Ihre Schritte "wenn ich fertig bin" kompliziert werden, extrahieren Sie sie zu einer anderen Funktion und rufen Sie sie einfach von jedem Punkt aus an. In diesem Fall, da es nur 2 Zeilen waren, schien es fair zu duplizieren.

    
robrich 24.05.2012 03:07
quelle
1

Wenn Sie die Anforderung erfüllen, können Sie auch die "Filter" -Methode des Unterstrichs Ссылка

verwenden %Vor%     
Federico Fissore 24.05.2012 08:04
quelle
0
%Vor%

Es scheint mir, dass Sie bei jeder Schleifeniteration eine "Kopie" von j machen müssen. Sie können dies mit Verschlüssen machen.

%Vor%

Auf diese Weise speichern Sie den Zustand von j bei jeder Iteration. Dieser Status wird in jedem IIFE gespeichert. Sie haben so viele gespeicherte Zustände - wie die for-Schleifen. Wenn der DB zurückgibt:

%Vor%

j_copy behält den Wert des ursprünglichen j, das es im Moment

hat %Vor%

Ich weiß, dass meine erklärenden Fähigkeiten sehr schlecht sind, aber ich hoffe, du verstehst, was ich meine.

Bearbeiten: Auf diese Weise verwenden wir die sofort aufgerufene Funktion und ihren Umfang, um eine separate private Kopie von j zu behalten. Bei jeder Iteration wird ein neuer IIFE mit einem eigenen privaten Bereich erstellt. In diesem Bereich - für jede für die Iteration j_copy = j. Und diese j_copy kann innerhalb von IIFE verwendet werden, ohne jedes Mal von der for-Schleife überschrieben zu werden.

    
linderman 31.12.2016 15:09
quelle