微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

await 在嵌套的 for...of 循环中不起作用 -- typeorm - nodejs

如何解决await 在嵌套的 for...of 循环中不起作用 -- typeorm - nodejs

我正在尝试获取一些数据并将它们添加到现有数据集(对象)中,但数据显示为空。但是,我可以使用 typeorm 查询数据库获取数据。

我意识到我的错误是该方法在我的循环完全迭代之前返回数据。发现 for...of 循环对 async/await 效果更好。但仍然没有运气。

这是我想要做的:

export const getTopicDetails = async (
  req: Request,res: Response
): Promise<Response> => {
  try {
    let topicDetail: any = await Chapter.createqueryBuilder("topic")
      .leftJoinAndSelect("topic.grs","grs")
      .leftJoinAndSelect("grs.srs","srs")
      .leftJoinAndSelect("grs.points","grs_points")
      .leftJoinAndSelect("srs.points","srs_points")
      .leftJoinAndSelect("grs_points.srs","grs_points_srs")
      .leftJoinAndSelect("grs_points.points","grs_points_points")
      .leftJoinAndSelect("srs_points.points","srs_points_points")
      .where("topic.id = :id",{ id: req.params.id })
      .andWhere("grs.sequence IS NULL")
      .andWhere("srs.parent_sr_id IS NULL")
      .orderBy("grs.id","ASC")
      .addOrderBy("grs_points.sequence","ASC")
      .getone();

    for (const gr of topicDetail.grs) {
      for (const point of gr.points) {
        for (const firstLevelPoint of point.points) {
          var srs = await Srmodule.createqueryBuilder("srs")
            .where("srs.grId = :grId",{ grId: firstLevelPoint.id })
            .getMany();

          // this is returning an empty object
          nestedProperty.set(topicDetail,`2`,srs);
          
          // this thing returns as expected
          nestedProperty.set(topicDetail,`3`,[
            {
                "id": 5,"srNo": "1.01.02.01","grId": 7,"title": "test","description": "lorem ipsum dolor sit amet","created_at": "2021-06-21","addedBy": 1,}
        ]);
        }
      }
    }

    if (topicDetail) {
      return res.status(200).json({
        status: true,data: topicDetail,});
    } else {
      return res.status(404).json({ status: false,error: "No data found" });
    }
  } catch (error) {
    return res.status(500).json({ status: false,error: error });
  }
};

这是我得到的回应:

"status": true,"data": {
        "1": 1,"2": {},"3": [
            {
                "id": 5,}
        ]
    }

感谢任何帮助。

解决方法

"await" 只能在异步函数中使用!

async function getData() {
  const data = await doSomeAsyncWork();
  console.log(data)
}

function doSomeAsyncWork() {
  return Promise.resolve("data");
}

getData();

所以将所有的 for 循环包装在一个异步函数中!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。