mongoose中数组循环查询find结果的同步实现

在项目中,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})
		}
	})
})

那么结果就是我们想要得到的结果。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值