使用foreach Node.js时异步/等待的结果

时间:2020-09-10 10:19:46

标签: node.js asynchronous foreach async-await

这是我的代码

  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中,它消失了 您能为我解释一下,并告诉我如何解决吗?

2 个答案:

答案 0 :(得分:0)

forEach忽略作为参数传递给函数的functrion返回的promise。它将为每个元素调用该函数,该函数将一直运行直到产生为止,并返回一个Promise。因此,forEach与异步功能完全不兼容。

答案 1 :(得分:0)

forEach启动异步功能,然后继续运行而无需等待它们完成。因此,console.log(listShift); //2部分在任何目标调用之前 运行。

要等待异步功能完成,请使用mapPromise.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