关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题

文章讨论了在JavaScript中,使用原生for循环替代forEach循环可以解决由于异步操作导致的问题,即确保数据库查询完成后再进行后续处理,避免了数据提前发送给前端导致的空数组问题。
摘要由CSDN通过智能技术生成

使用 原生的 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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值