问题描述我需要做一个返回数据集,是个对象数组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=`SELECTcollege.collegeName,counselorclasscontact.classId,class.classNameFROMcounselorclasscontact,class,collegeWHEREclass.classId=counselorclasscontact.classIdANDclass.collegeId=college.collegeIdANDcounselorclasscontact.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=`SELECTDISTINCTawardinformation.studentId,student.nameFROMstudent,awardinformationWHEREawardinformation.classId=?ANDawardinformation.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=`SELECTawardinformation.awardName,awardinformation.awardTime,awardinformation.awardAgencyFROMawardinformationWHEREawardinformation.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()来构建结果集,层层调用。
慕丝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);})})
添加回答
举报
0/150
提交
取消