MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment s'assurer qu'un appel asynchrone est exécuté avant de revenir d'une fonction dans Mongoose ?

Vous devriez toujours utiliser async mais vous avez besoin de async.waterfall pour ça. Voici ce dont vous devez tenir compte :

Une méthode principale pour appeler votre async fonction :

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

Ensuite, vous avez besoin que vos fonctions soient async convivial, cela signifie que vous devez utiliser des rappels et donner vos données d'une fonction à une autre. Quelque chose comme ça :

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

Ensuite, vous devez appeler vos fonctions dans votre méthode principale :

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

Et voilà, vous avez 3 fonctions qui doivent être exécutées les unes après les autres et aucun enfer de rappel n'est nécessaire.