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

Wie kann sichergestellt werden, dass ein asynchroner Aufruf ausgeführt wird, bevor eine Funktion in Mongoose zurückgegeben wird?

Sie sollten trotzdem async verwenden aber Sie brauchen async.waterfall dafür. Folgendes müssen Sie beachten:

Eine Hauptmethode zum Aufrufen Ihres async Funktion:

var getInformation = function(){
  async.waterfall([
    //Array of your functions in order, we will be back here later
  ], function (err) {
       if(err){
         console.log(err);
       }else{
         console.log('Everything OK!');
     }
  );
}

Dann müssen Ihre Funktionen async sein freundlich, das heißt, Sie sollten Rückrufe verwenden und Ihre Daten von einer Funktion zur anderen geben. Etwa so:

function findUser(callback){
  //Do something
  if('Everything OK'){
    callback(err, yourData); //err should be null if everything is OK and yourData should be the data that you wanna use in your next function. e.g. schoolId 
  }else{
    callback(err); //Something was wrong, "err" should have something different to null
  }
}

function findSchool(callback, schoolId){ //Note that we receive the parameter schoolId here but not in the first function
  //Do something
  if('Everything OK'){
    callback(err, yourData); //err should be null if everything is OK and yourData should be the data that you wanna use in your next function. e.g. schoolName 
  }else{
    callback(err); //Something was wrong, "err" should have something different to null
  }
}

function findStudents(callback, schoolName){
  //Do something
  if('Everything OK'){
    callback(err); //err should be null if everything is OK if this is the last function maybe we don't need to send back more data from here 
  }else{
    callback(err); //Something was wrong, "err" should have something different to null
  }
}

Dann sollten Sie Ihre Funktionen in Ihrer Hauptmethode aufrufen:

var getInformation = function(){
  async.waterfall([
    findUser,
    findSchool,
    findStudents
    //Note that there is no need to tell the functions the parameters they are sending or receiving here
  ], function (err) {
       if(err){
         console.log(err);
       }else{
         console.log('Everything OK!');
     }
  );
}

Und das war's, Sie haben 3 Funktionen, die nacheinander ausgeführt werden sollen und es wird keine Callback-Hölle benötigt.