MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

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

"asynchron " ist ein sehr beliebtes Modul, um asynchrone Schleifen zu abstrahieren und Ihren Code leichter lesbar/verwaltbar zu machen. Zum Beispiel:

var async = require('async');

function getHonorStudentsFrom(stuObjList, callback) {

    var honorStudents = [];

    // The 'async.forEach()' function will call 'iteratorFcn' for each element in
    // stuObjList, passing a student object as the first param and a callback
    // function as the second param. Run the callback to indicate that you're
    // done working with the current student object. Anything you pass to done()
    // is interpreted as an error. In that scenario, the iterating will stop and
    // the error will be passed to the 'doneIteratingFcn' function defined below.
    var iteratorFcn = function(stuObj, done) {

        // If the current student object doesn't have the 'honor_student' property
        // then move on to the next iteration.
        if( !stuObj.honor_student ) {
            done();
            return; // The return statement ensures that no further code in this
                    // function is executed after the call to done(). This allows
                    // us to avoid writing an 'else' block.
        }

        db.collection("students").findOne({'_id' : stuObj._id}, function(err, honorStudent)
        {
            if(err) {
                done(err);
                return;
            }

            honorStudents.push(honorStudent);
            done();
            return;
        });
    };

    var doneIteratingFcn = function(err) {
        // In your 'callback' implementation, check to see if err is null/undefined
        // to know if something went wrong.
        callback(err, honorStudents);
    };

    // iteratorFcn will be called for each element in stuObjList.
    async.forEach(stuObjList, iteratorFcn, doneIteratingFcn);
}

Sie könnten es also so verwenden:

getHonorStudentsFrom(studentObjs, function(err, honorStudents) {
    if(err) {
      // Handle the error
      return;
    }

    // Do something with honroStudents
});

Beachten Sie, dass .forEach() ruft Ihre Iteratorfunktion für jedes Element in stuObjList "parallel" auf (d. h. es wird nicht darauf gewartet, dass eine Iteratorfunktion für ein Arrayelement aufgerufen wird, bevor sie für das nächste Arrayelement aufgerufen wird). Das bedeutet, dass Sie die Reihenfolge, in der die Iteratorfunktionen – oder noch wichtiger, die Datenbankaufrufe – ausgeführt werden, nicht wirklich vorhersagen können. Endergebnis:unvorhersehbare Reihenfolge der Ehrenschüler. Wenn die Reihenfolge wichtig ist, verwenden Sie .forEachSeries() Funktion.