由于缺乏异步编程经验,在 api 调用期间未获得所需的输出

Not getting the desired output during api call due to asycnronous programming inexperience

我想谈谈与 object.But 不同的价值观,因为我在异步编程方面的经验较少,所以我被困住了。这是方法

gameSchema.methods.computeBets = async function(callback){
    const game = this;
    try {
        const { gameType } = game;
        let model = Schema;
        gameType === 'Fast Parity' ? model = FastParity : model = SlowParity;
        const gameDetails = await model.findOne({ gameId: game._id });
        const { allPlayerBetted } = gameDetails;
        let color = {};
        let number = {};
        allPlayerBetted.forEach(async (bet) => {
            const betdetails = await UserBet.findById(bet._id);
            const { colorBettedOn, numberBettedOn, amountBettedOnColor, amountBettedOnNumber } = betdetails;
            console.log(colorBettedOn, numberBettedOn, amountBettedOnColor, amountBettedOnNumber);
            if (!color.colorBettedOn)
                color[colorBettedOn] = amountBettedOnColor;
            else
                color.colorBettedOn += amountBettedOnColor;
            if (!number.numberBettedOn)
                number[numberBettedOn] = amountBettedOnNumber;
            else
                number.numberBettedOn += amountBettedOnNumber;
        });
        callback(color, number);
    }
    catch(error)
    {
        console.log(error);
  
    }
  }

这是 api 调用:

router.post('/game/computeBets/:id', async(req, res)=> {
    try {
        const game = await Game.findById(req.params.id);
       await game.computeBets((color,number)=>console.log(color,number));
        // console.log(game);
        res.send();
    } catch (error)
    {
        console.log(error);
        res.status(500).send();
    }
})

现在调用此 api 时得到以下输出: {} {} 紫色 3 29 49 紫色 3 29 49 紫色 3 29 49

我尝试了很多方法,但没有任何效果。帮助函数

您不能真正将 forEachawait 一起使用,您需要改为:

allPlayerBetted.forEach(async (bet) => {
  // ...
});

await Promise.all(allPlayerBetted.map(async (bet) => {
  // ...
}));

解释一下,当你有

allPlayerBetted.forEach(async (bet) => {
    // ...
    return
});

这相当于

allPlayerBetted.forEach((bet) => {
    return new Promise();
});

但实际上没有什么是等待 promise 解决的。你想要取回的是一组承诺:

allPlayerBetted.map((bet) => {
    return new Promise();
});

然后您可以使用 Promise.all

等待所有问题解决
await Promise.all(allPlayerBetted.map((bet) => {
    return new Promise();
}));

然后如果你想在里面等待:

await Promise.all(allPlayerBetted.map(async (bet) => {
    await somePromise();
    return;
}));

你会得到你想要的。