这是我的代码
const listShift = await Shift.find().and([{ "shiftInstance.workers.worker": req.user }, { "shiftInstance.date": Date.parse(date) }]).select("name startTime endTime -_id target").populate("target target.checkPoints.checkPoint")
//Find checkpoint
listShift.forEach(async shift =>{
listShift.target = await Target.findById(shift.target).populate("checkPoints.checkPoint")
console.log(listShift); //1
})
console.log(listShift); //2
在1中,我有等待目标的结果...但在2中,它消失了 您能为我解释一下,并告诉我如何解决吗?
答案 0 :(得分:0)
forEach忽略作为参数传递给函数的functrion返回的promise。它将为每个元素调用该函数,该函数将一直运行直到产生为止,并返回一个Promise。因此,forEach与异步功能完全不兼容。
答案 1 :(得分:0)
forEach
启动异步功能,然后继续运行而无需等待它们完成。因此,console.log(listShift); //2
部分在任何目标调用之前 运行。
要等待异步功能完成,请使用map
和Promise.all
:
await Promise.all(listShift.map(async shift =>{
listShift.target = await Target.findById(shift.target).populate("checkPoints.checkPoint")
console.log(listShift); //1
}));
console.log(listShift); //2