同步nodeJS命令

时间:2017-09-07 16:29:27

标签: node.js mongodb control-flow

我使用此函数在使用mongoose的mongo db中保存测试:

 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\" }");       
            } 
        });
  });

问题是在for循环结束之前调用了test.save(..)。结果是测试保存在数据库中,并且字段问题为空。 如何在执行命令.save之前将问题推送到测试中?

1 个答案:

答案 0 :(得分:0)

exec应返回Promise,您可以使用该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\" }")); 等待其完成:

add_filter( 'get_script_data', 'change_nav_direction' );

 function change_nav_direction( $variable ) {
   //any other code you may need

                'directionNav'   => true,

 //you must have a return
 return $variable;
}