【问题标题】:await not working inside nested for...of loop -- typeorm - nodejs等待在嵌套的 for...of 循环中不起作用 - typeorm - nodejs
【发布时间】:2021-09-07 01:41:10
【问题描述】:

我正在尝试获取一些数据并将其添加到现有数据集(对象),但数据显示为空。但是,我可以使用 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,
                "srNo": "1.01.02.01",
                "grId": 7,
                "title": "test",
                "description": "lorem ipsum dolor sit amet",
                "created_at": "2021-06-21",
                "addedBy": 1,
            }
        ]
    }

感谢任何帮助。

【问题讨论】:

  • 我想出了一个解决方法。我对这种嵌套的树实体有太多问题。所以我决定把我所有的整体放在一个数据库表中并添加父子关系。这样我就可以通过查询来提取它们,但不知道为什么查询返回不完整的数据。所以我再次使用一个函数来构建一个嵌套对象,其中包含我从查询中获得的原始数组。这是一个示例:gist.github.com/subhamchbty/6dd2367d06906bde988b2834692cded6

标签: javascript node.js async-await typeorm for-of-loop


【解决方案1】:

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

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

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

getData();

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

【讨论】:

  • 所有这些都已经在 async 函数中。我已经更新了完整的代码,请看一下。
  • @SubhamChakraborty 那么更新代码后你遇到了什么问题??
  • 仍然得到一个空对象
  • 很抱歉。尝试将问题分解成更小的部分,而不是一次性完成。使用调试器看看出了什么问题。这不是我可以重现的问题,因为我无权访问您的数据库!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多