首页 > 解决方案 > 由于异步编程经验不足,在 api 调用期间无法获得所需的输出

问题描述

我想从对象中说出不同的值。但是由于异步编程方面的经验较少,我被卡住了。这是方法

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 我得到这个输出: {} {} voilet 3 29 49 voilet 3 29 49 voilet 3 29 49

我尝试了很多东西,但没有任何效果。帮助功能

标签: javascriptmongodbasynchronouscallback

解决方案


您不能真正使用forEachwith await,而是要更改:

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

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

解释一下,当你有

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

这相当于

allPlayerBetted.forEach((bet) => {
    return new 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;
}));

你得到你想要的。


推荐阅读