本文主要是介绍关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用 原生的 for循环替代forEach循环即可解决问题
1.实例代码:
select_Father_comment_sql_res.forEach( (item) => {const Select_FId_children_sql = util.format("Select *, \IFNULL(User.UserName,'') as CommentUserName, \IFNULL(User.UserName,'') as AtUserName\From Comment Left Join User ON\Comment.CreateUserId=User.UserId Where FatherCommentId=%s",item.CommentId);const Select_FId_children_sql_res = await query(Select_FId_children_sql);console.log("3433333", Select_FId_children_sql_res);if (Select_FId_children_sql_res[0]) {Select_FId_children_sql_res.forEach((itemZi) => {console.log("6666", itemZi);CommentZiList.push(itemZi);});}})console.log("9999999999999999");res.send({status: 0,CommentList: CommentFuList,ZI: CommentZiList,});console.log("9999999999999999");
2.此处会发现双log打印会早于forEach中循环的 6666等打印,且前端接收到的ZI也是同为空数组,证明res.send还未等forEach完成,就已经被执行。
3.此时,换成for 循环 即可解决问题
for (let i = 0; i < select_Father_comment_sql_res.length; i++) {const Select_FId_children_sql = util.format("Select *, \IFNULL(User.UserName,'') as CommentUserName, \IFNULL(User.UserName,'') as AtUserName\From Comment Left Join User ON\Comment.CreateUserId=User.UserId Where FatherCommentId=%s",select_Father_comment_sql_res[i].CommentId);const Select_FId_children_sql_res = await query(Select_FId_children_sql);console.log("3433333", Select_FId_children_sql_res);if (Select_FId_children_sql_res[0]) {Select_FId_children_sql_res.forEach((itemZi) => {console.log("6666", itemZi);CommentZiList.push(itemZi);});}}console.log("9999999999999999");res.send({status: 0,CommentList: CommentFuList,ZI: CommentZiList,});console.log("9999999999999999");
这篇关于关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!