等待 foreach 完成 NodeJS

Hir*_*bar 2 mongoose node.js

所以,我在 NodeJS 中创建了一个 API。在一个 API 中,我必须在 mongoose 查询中调用 for 循环。

如何在执行 res.send() 之前等待 forEach 完成?我在下面附上了我的代码。

router.post("/getResult", function (req, res) {
    const lottery_id = req.body.lottery_id;
    const prizeQuery = Prize.find({"lotid": lottery_id});

    let response = [];

    prizeQuery.exec(function (err, prizes) {
        console.log(prizes.length);
        if (err) return res.send({success: 0, data: err});
        else {
            prizes.forEach(prize => {
                let prizeData = {};
                const winnerQuery = Winner.find({"id": prize._id});
                winnerQuery.exec(function (err, winners) {
                    if (err) return res.send({success: 0, data: err});
                    else {
                        prizeData = {
                            prize: prize,
                            winners: winners
                        };
                        response.push(prizeData);
                    }
                });
            });
        }
    });
    return res.send({success:1, data: response});
});
Run Code Online (Sandbox Code Playgroud)

在上面的代码中, return 在 forEach 完成之前被调用。

Ram*_*rar 5

因为您在内部运行异步代码forEach并且forEach不会等到异步代码完成,所以您必须使用等待原语包装您的异步代码。

此外,您提供的代码将send在失败时调用两次,因为内部的返回forEach实际上不会结束封闭函数。

try {
    await Promise.all(prizes.map(async (prize) => {
        const winners = await Winner.find({"id": prize._id});
        response.push({prize, winners});
    }))
    res.send({success:1, data: response});
} catch (err) {
    res.send({success: 0, data: err});
}
Run Code Online (Sandbox Code Playgroud)