如何解决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 举报,一经查实,本站将立刻删除。