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 循环包装在一个异步函数中!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...