MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come garantire che una chiamata asincrona venga eseguita prima di tornare da una funzione in Mongoose?

Dovresti comunque usare async ma hai bisogno di async.waterfall per quello. Ecco cosa devi considerare:

Un metodo principale per chiamare il tuo async funzione:

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

Quindi devi che le tue funzioni siano async amichevole, ciò significa che dovresti usare i callback e trasferire i tuoi dati da una funzione all'altra. Qualcosa del genere:

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

Quindi dovresti chiamare le tue funzioni nel tuo metodo 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!');
     }
  );
}

E il gioco è fatto, hai 3 funzioni che dovrebbero essere eseguite una dopo l'altra e non è necessario alcun callback hell.