在项目中,mongoose的find方法查询是异步查询的,所以得到的结果是异步的结果,看下面的例子。
根据试卷的id号查找对应试卷中的试题,找到试题id后找到试题信息。
加入试题数据库信息如下:
{
"_id" : ObjectId("59dc79ddcf9bb828c4689284"),
"quesType" : "1",
"quesStem" : "第1单选",
"quesAns" : "A",
"quesAla" : "第1单选",
"quesSel" : [
"第1单选",
"第1单选",
"第1单选",
"第1单选"
]
}
quesType是试题类型(单选/多选/判断),quesStem是试题题干,quesAns是试题答案,quesAla试题结果分析,quesSel试题选项。后台查询代码如下:
var length; //试题长度
var quesList; //试题信息
Exam.find({
_id:id
}).then((info){
var idArr = info.split(',')
idArr.forEach((id)=>{
Ques.find({
_id:id
}).then((quesInfo)={
quesList.push(quesInfo)
})
})
})
理论上我们想要得到的结果就像是数据表中一一对应的结果,然后结果并非这样,因为find方法是异步的,查询结果是不确定的。
如何实现一一对应的结果呢,类似于同步方法呢?
方法是Promise.all方法。代码如下:
var length; //试题长度
var quesList; //试题信息
Exam.find({
_id:id
}).then((info){
var idArr = info.split(',');
length=idArr.length;
var promises = idArr.map((id)=>{
return Ques.find({ //记得必须要return
_id:id
})
})
return Promise.all(promises)
}).then((objList)=>{
objList.forEach((info)=>{
//获取试题信息:试题类型,试题题干,试题选项
objInfo.push({quesType:info[0].quesType,quesStem:info[0].quesStem,quesSel:info[0].quesSel})
//返回前台查询结果。判断添加是试题信息的长度等于之前获取试题id号的长度
if(quesList.length==length){
res.json({quesInfo:quesList})
}
})
})
那么结果就是我们想要得到的结果。