为了账号安全,请及时绑定邮箱和手机立即绑定

js异步构建包含对象的数据返回集问题十分感谢

js异步构建包含对象的数据返回集问题十分感谢

千万里不及你 2019-08-21 12:47:03
问题描述我需要做一个返回数据集,是个对象数组awardList,里面的每一个对象有className属性和stuInfo属性,stuInfo属性是一个对象数组,然后里面的对象的属性有name和awardInfo,这些对象和数组都是构造出来的,利用数据库查询出来的数据逐一进行填充,我自己写的代码执行完之后,发现awarsList依旧是一个空数组,感觉还是异步的问题,却找不出问题在哪。问题出现的环境背景及自己尝试过哪些方法之前使用的是回调函数,后来改写成Promise相关代码//请把代码文本粘贴到下方(请勿用图片代替代码)letgetClassInfo=function(jobId){letsql=`SELECTcounselorclasscontact.classId,class.classNameFROMcounselorclasscontact,classWHEREclass.classId=counselorclasscontact.classIdANDcounselorclasscontact.jobId=?`;returnnewPromise(function(resolve,reject){db.query(sql,[jobId],function(results,field){try{resolve(results)}catch(err){reject(err)}})})}letgetStuInfo=function(classId){letsql=`SELECTDISTINCTawardinformation.studentId,student.nameFROMstudent,awardinformationWHEREawardinformation.classId=?ANDawardinformation.studentId=student.studentId`;returnnewPromise(function(resolve,reject){db.query(sql,[classId],function(results,field){try{resolve(results)}catch(err){reject(err)}})})}letgetStuAwardInfo=function(studentId){letsql=`SELECTawardinformation.awardName,awardinformation.awardTime,awardinformation.awardAgencyFROMawardinformationWHEREawardinformation.studentId=?`;returnnewPromise(function(resolve,reject){db.query(sql,[studentId],function(results,field){try{resolve(results)}catch(err){reject(err)}})})}exports.getAwardByCounselor=function(send,jobId){letawardInfoList=[];//letclassResult=awaitgetClassInfo(jobId);getClassInfo(jobId).then(function(classResult){for(leti=0;i
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

已解决!源代码如下:
letgetClassInfo=async(jobId)=>{
letsql=`SELECT
college.collegeName,
counselorclasscontact.classId,
class.className
FROM
counselorclasscontact,
class,
college
WHERE
class.classId=counselorclasscontact.classId
ANDclass.collegeId=college.collegeId
ANDcounselorclasscontact.jobId=?`;
returnnewPromise(async(resolve,reject)=>{
try{
letclassResult=awaitdb.queryByPromise(sql,jobId);
letparseReuslt=JSON.parse(JSON.stringify(classResult));
resolve(parseReuslt);
}catch(e){
reject(e);
}
})
}
letgetStuInfo=async(classId)=>{
letsql=`SELECT
DISTINCTawardinformation.studentId,
student.name
FROM
student,
awardinformation
WHERE
awardinformation.classId=?
AND
awardinformation.studentId=student.studentId`;
returnnewPromise(async(resolve,reject)=>{
try{
letstuInfo=awaitdb.queryByPromise(sql,classId);
letparseReuslt=JSON.parse(JSON.stringify(stuInfo));
resolve(parseReuslt);
}catch(e){
reject(e);
}
})
}
letgetStuAwardInfo=async(studentId)=>{
letsql=`SELECT
awardinformation.awardName,
awardinformation.awardTime,
awardinformation.awardAgency
FROM
awardinformation
WHERE
awardinformation.studentId=?`;
returnnewPromise(async(resolve,reject)=>{
try{
letstuAwardList=awaitdb.queryByPromise(sql,studentId);
letparseReuslt=JSON.parse(JSON.stringify(stuAwardList));
resolve(parseReuslt);
}catch(e){
reject(e);
}
})
}
exports.getAwardByCounselor=async(jobId)=>{
returnnewPromise(async(resolve,reject)=>{
try{
letclassInfo=awaitgetClassInfo(jobId);
for(leti=0;iclassInfo[i].stuInfo=[];
letstuInfo=awaitgetStuInfo(classInfo[i].classId);
if(stuInfo.length!==0){
stuInfo.forEach(item=>{
classInfo[i].stuInfo.push(item);
})
}
if(classInfo[i].stuInfo.length!==0){
console.log(classInfo[i].stuInfo);
for(letj=0;jletawardInfo=awaitgetStuAwardInfo(stuInfo[j].studentId);
classInfo[i].stuInfo[j].Info=[];
for(letk=0;kclassInfo[i].stuInfo[j].Info.push(awardInfo[k]);
}
}
}
}
resolve(classInfo);
}catch(e){
reject(e);
}
})
}
思路:跟提出的问题代码没有太大区别,只不过原来的主函数代码是利用回调函数来解决问题的,我这边全部改成Promise并结合async的语法糖来让代码看起来更像同步。最后经过询问得知,错误是我在问题中的函数getAwardByCounselor()中定义了一个awardInfoList数组,用来承载异步函数返回和构建的结果,在最后一步send(awardInfoList)时,由于是同步代码,未等到异步函数执行完就直接执行,导致最后的数据集为空。改进之后直接拿第一步获取班级信息函数getClassInfo()来构建结果集,层层调用。
                            
查看完整回答
反对 回复 2019-08-21
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

错误:
returnnewPromise(function(resolve,reject){
db.query(sql,[jobId],function(results,field){
try{
resolve(results)
}catch(err){
reject(err)
}
})
})
首先,回调函数的第一个参数一定是error,也就是说你这里的results并不是你期待的结果,实际是出错情况下的错误信息。其次,try...catch这里没有任何作用,你要捕获的错误应该是执行db.query可能抛出的异常,这个异常对应回调的第一个参数,但是你却捕获resolve。
修正:
returnnewPromise(function(resolve,reject){
db.query(sql,[jobId],function(err,results,field){
if(err)reject(err);
resolve(results);
})
})
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 442 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信