sql >> Databáze >  >> NoSQL >> MongoDB

v nodejs, jak zastavit smyčku FOR, dokud se nevrátí volání mongodb

"async " je velmi oblíbený modul pro odstranění asynchronního cyklování a usnadnění čtení/údržby kódu. Například:

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);
}

Takže byste to mohli použít takto:

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

    // Do something with honroStudents
});

Všimněte si, že .forEach() zavolá vaši funkci iterátoru pro každý prvek v stuObjList "paralelně" (tj. nebude čekat na dokončení volání jedné funkce iterátoru pro jeden prvek pole, než ji zavolá na další prvek pole). To znamená, že nemůžete skutečně předvídat pořadí, ve kterém budou funkce iterátoru – nebo co je důležitější, volání databáze – spuštěny. Konečný výsledek:nepředvídatelné pořadí studentů. Pokud na objednávce záleží, použijte .forEachSeries() funkce.



  1. Názvy polí FieldPath nesmí obsahovat '.' při pokusu o použití AGGREGATE

  2. Chyba Mongoose Promise

  3. Aktualizujte vnořený dokument obsažený v poli obsaženém v dokumentu MongoDB

  4. Funkce MapReduce v MongoDB - Seskupení dokumentu podle ID