如何快速执行嵌套for循环中编写的等待函数



也许我的问题标题错了。但我在解释身体里的一切。我的问题是,我正在点击API了解学生的详细信息。这提供了多个学生记录。

响应示例

{
"TotalRecords": "372",
"StudentName": "John Carter",
"StudentImage": "",
"AnotherKey": "Another Value",
"AnotherKey1": "Another Value1",
"ClassDetail": [
{"class":"5","rollnumber":"123"},
{"class":"6","rollnumber":"456"},
{"class":"7","rollnumber":"678"}
],
"ChildCenterLocationList": [
{
"CenterLocationId": "4",
"CenterLocationName": "Stockton"
}
]

},
{
"TotalRecords": "372",
"StudentName": "John Luke",
"StudentImage": "",
"AnotherKey": "Another Value",
"AnotherKey1": "Another Value1",
"ClassDetail": [
{"class":"5","rollnumber":"123"},
{"class":"6","rollnumber":"456"},
{"class":"7","rollnumber":"678"}
],
"ChildCenterLocationList": [
{
"CenterLocationId": "4",
"CenterLocationName": "Stockton"
}
]

}

为此,我在控制器页面上写下了简单的逻辑

exports.GetChildsDetail = async function (req, res) {
try {

let parms = [req.userId, req.query.Date];
let spRes = await _dbContaxt.ExcuteQuery(StoredProcdureName, parms);
if (spRes != null && spRes.length > 0) {
//till now everything is good. I am getting the response properly as I mentioned above and sending it to client
}
}

})

现在又来了一个要求,你必须使用ClassDetail键中的卷号为每个学生找到每个课程的主题详细信息和评分表详细信息。

所以ClassDetail密钥将类似于

"ClassDetail": [
{
"class":"5",
"rollnumber":"123",
"subjectDetail": [{'subject1detail'},{'subject1detail'},{'subject1detail'}]
"mrksheetDetail": [{'this is again an complex object'}]
},
{
"class":"6",
"rollnumber":"456",
"subjectDetail": [{'subject1detail'},{'subject1detail'},{'subject1detail'}]
"mrksheetDetail": [{'this is again an complex object'}]
}
{
"class":"7",
"rollnumber":"678",
"subjectDetail": [{'subject1detail'},{'subject1detail'},{'subject1detail'}]
"mrksheetDetail": [{'this is again an complex object'}]
}
]

所以我再次这样做,就像我在上所做的那样

exports.GetChildsDetail = async function (req, res) {
try {

let parms = [req.userId, req.query.Date];
let spRes = await _dbContaxt.ExcuteQuery(StoredProcdureName, parms);
if (spRes != null && spRes.length > 0) {
for (var clients of spRes.ResData) {
let arrSubCodes = [];
for (var authList of clients.ClassDetail) {
let parms1 = [req.userId, authList.rollnumber, req.query.Date];
let spRes1 = await _dbContaxt.ExcuteQuery(_StoredProcedureForSubject, parms1);
if (spRes1 != null && spRes1.length > 0) {
arrSubCodes.push(singleData1.ResData.SubjectDetail)
}
}
clients.subjectDetail= arrSubCodes;
}
}
}


})

结果就要来了,但这花了太多时间,差不多2分钟。我只有10个学生。所以我尝试了另一种更快的方法,但它只适用于循环的最后一卷。代码是在调用主循环之后生成的。

if (spRes != null && spRes.length > 0) {
await Promise.all( spRes.ResData.map(async (item) => {

return new Promise((resolve, reject) => {
for (var i in item.ClassDetail) {
let parms2 = [req.userId, item.ClassDetail[i].rollnumber];
_dbContaxt.ExcuteQuery(_dbHelper._StoredProcedureForSubject, parms2).then(spRes1=>{
if (spRes1 != null && spRes1.length > 0) {
item.ClassDetail[i].subjectDetail= spRes1.ResData;
resolve()
}
})
}
})
}))
}

此代码仅适用于最后一个卷号。如果我在ClassDetail键中有多条记录,那么它只适用于最后一条记录。

正如@bergi所说,我已经尝试过了,它的运行良好

if (spRes != null && spRes.length > 0) {
await Promise.all( spRes.ResData.map(async (item) => {
for (var i in item.ClassDetail) {
let parms2 = [req.userId, item.ClassDetail[i].rollnumber];
let spRes1 = await _dbContaxt.ExcuteQuery(_dbHelper._StoredProcedureForSubject, parms2)
if (spRes1 != null && spRes1.length > 0) {
item.ClassDetail[i].subjectDetail= spRes1.ResData;
}
}
}))
}

最新更新