第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

js異步構(gòu)建包含對(duì)象的數(shù)據(jù)返回集問題十分感謝

js異步構(gòu)建包含對(duì)象的數(shù)據(jù)返回集問題十分感謝

千萬(wàn)里不及你 2019-08-21 12:47:03
問題描述我需要做一個(gè)返回?cái)?shù)據(jù)集,是個(gè)對(duì)象數(shù)組awardList,里面的每一個(gè)對(duì)象有className屬性和stuInfo屬性,stuInfo屬性是一個(gè)對(duì)象數(shù)組,然后里面的對(duì)象的屬性有name和awardInfo,這些對(duì)象和數(shù)組都是構(gòu)造出來(lái)的,利用數(shù)據(jù)庫(kù)查詢出來(lái)的數(shù)據(jù)逐一進(jìn)行填充,我自己寫的代碼執(zhí)行完之后,發(fā)現(xiàn)awarsList依舊是一個(gè)空數(shù)組,感覺還是異步的問題,卻找不出問題在哪。問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法之前使用的是回調(diào)函數(shù),后來(lái)改寫成Promise相關(guān)代碼//請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

已解決!源代碼如下:
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);
}
})
}
思路:跟提出的問題代碼沒有太大區(qū)別,只不過原來(lái)的主函數(shù)代碼是利用回調(diào)函數(shù)來(lái)解決問題的,我這邊全部改成Promise并結(jié)合async的語(yǔ)法糖來(lái)讓代碼看起來(lái)更像同步。最后經(jīng)過詢問得知,錯(cuò)誤是我在問題中的函數(shù)getAwardByCounselor()中定義了一個(gè)awardInfoList數(shù)組,用來(lái)承載異步函數(shù)返回和構(gòu)建的結(jié)果,在最后一步send(awardInfoList)時(shí),由于是同步代碼,未等到異步函數(shù)執(zhí)行完就直接執(zhí)行,導(dǎo)致最后的數(shù)據(jù)集為空。改進(jìn)之后直接拿第一步獲取班級(jí)信息函數(shù)getClassInfo()來(lái)構(gòu)建結(jié)果集,層層調(diào)用。
                            
查看完整回答
反對(duì) 回復(fù) 2019-08-21
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

錯(cuò)誤:
returnnewPromise(function(resolve,reject){
db.query(sql,[jobId],function(results,field){
try{
resolve(results)
}catch(err){
reject(err)
}
})
})
首先,回調(diào)函數(shù)的第一個(gè)參數(shù)一定是error,也就是說你這里的results并不是你期待的結(jié)果,實(shí)際是出錯(cuò)情況下的錯(cuò)誤信息。其次,try...catch這里沒有任何作用,你要捕獲的錯(cuò)誤應(yīng)該是執(zhí)行db.query可能拋出的異常,這個(gè)異常對(duì)應(yīng)回調(diào)的第一個(gè)參數(shù),但是你卻捕獲resolve。
修正:
returnnewPromise(function(resolve,reject){
db.query(sql,[jobId],function(err,results,field){
if(err)reject(err);
resolve(results);
})
})
                            
查看完整回答
反對(duì) 回復(fù) 2019-08-21
  • 2 回答
  • 0 關(guān)注
  • 457 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)