sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur säkerställer man att ett asynkront anrop exekveras innan man återvänder från en funktion i Mongoose?

Du bör fortfarande använda async men du behöver async.waterfall för det. Det här är vad du behöver tänka på:

En huvudmetod för att anropa din 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!');
     }
  );
}

Då behöver du att dina funktioner är async vänlig, det betyder att du bör använda återuppringningar och ge dina data från en funktion till en annan. Något så här:

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

Då ska du anropa dina funktioner i din huvudmetod:

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

Och det är det, du har 3 funktioner som ska köras efter varandra och inget återuppringningshelvete behövs.



  1. Hur man byter ut ett element i ett arrayfält i mongodb

  2. Begränsa MongoDB RAM-användning

  3. Kombinera fulltext med annat index

  4. Vilket är det mest tidseffektiva sättet att serialisera/deserialisera en DataTable till/från Redis?