我使用此函数在使用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之前将问题推送到测试中?
答案 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;
}