MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

w nodejs, jak zatrzymać pętlę FOR do czasu powrotu wywołania mongodb

async " to bardzo popularny moduł do usuwania asynchronicznych pętli i ułatwiania czytania/utrzymywania kodu. Na przykład:

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

Możesz więc użyć tego w ten sposób:

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

    // Do something with honroStudents
});

Pamiętaj, że .forEach() wywoła twoją funkcję iteratora dla każdego elementu w stuObjList "równolegle" (tj. nie będzie czekać na zakończenie wywoływania jednej funkcji iteratora dla jednego elementu tablicy przed wywołaniem jej dla następnego elementu tablicy). Oznacza to, że tak naprawdę nie można przewidzieć kolejności, w jakiej funkcje iteratora — lub, co ważniejsze, wywołania bazy danych — będą uruchamiane. Efekt końcowy:nieprzewidywalny porządek honorowych uczniów. Jeśli kolejność ma znaczenie, użyj .forEachSeries() funkcja.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wyszukiwanie agregacji Mongo 3.6 z wieloma warunkami

  2. jak zwolnić buforowanie używane przez Mongodb?

  3. Przechowywanie milionów obrazów

  4. Błąd uwierzytelniania podczas próby zapisania w mongodb

  5. MongoDB $zakres