2017-09-07 2 views
0

i utiliser cette fonction pour enregistrer des tests dans un mongo db avec mangouste:Sync NodeJS commandes

Company.findOne({_id : companyId}).exec(function(err, company) { 
     if (err) { 
      console.log("Error:", err); 
     } 

     var test = new Test.Test({ 
      name:    body.testTitle, 
      numberQuestion:  body.numberProblems, 
      timer:    body.testTimer, 
      treshold:   body.testTreshold, 
      problems:   [], 
      company:   company 

     }) 

     for(var i = 0; i < body.testProblems.length; i++){ 
      Test.Question.findOne({_id : body.testProblems[i]}).exec(function(err, problem) { 
       if (err) { 
        console.log("Error:", err); 
       } 
       test.problems.push(problem); 
      }); 
     } 

     test.save(function(err) { 
      if(err){ 
       res.status(500).send("{ \"redirect\" : \"/test\" }"); 
      } 
      else{ 
       console.log(test); 
       res.status(200).send("{ \"redirect\" : \"/test\" }");  
      } 
     }); 
    }); 

le problème est que test.save(..) est appelé avant le de boucle se termine. Le résultat est un test enregistré dans la base de données avec les problèmes de champ vides. comment est-ce que je peux pousser les problèmes au test avant que la commande .save soit exécutée?

Répondre

0

exec doit retourner un Promise que vous pouvez utiliser pour attendre son achèvement:

var addingTestProblems = []; 
for(var i = 0; i < body.testProblems.length; i++){ 
    addingTestProblems.push(Test.Question 
     .findOne({_id : body.testProblems[i]}) 
     .exec(function(err, problem) { 
      if (err) { 
       console.log("Error:", err); 
      } 
      test.problems.push(problem); 
     })); 
} 

Promise.all(addingTestProblems) 
    .then(() => { 
     console.log(test); 
     res.status(200).send("{ \"redirect\" : \"/test\" }"); 
    }) 
    .catch(() => res.status(500).send("{ \"redirect\" : \"/test\" }"));