javascript - 由于异步编程经验不足,在 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
我尝试了很多东西,但没有任何效果。帮助功能
解决方案
您不能真正使用forEach
with 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;
}));
你得到你想要的。
推荐阅读
- reactjs - 带有 React 的 ApexChart:预选类别
- ftp - SFTP - PhpStorm 中的“读取数据包时出现 EOF”错误,在 FileZilla 中工作正常
- c - 计算大整数最大公约数的二元算法
- kubernetes - k8s & flannel --- 拨号 tcp 172.96.0.1:443: i/o timeout
- reactjs - 如何使用 Axios 将文件从 ReactJs 发送到 Flask
- python - mypyc:实现代理对象
- flutter - is there any way to regenerate flutter framework
- java - Maven 全新安装失败
- grep - 在分隔符上拆分后搜索单词
- python - Poor spectral clustering performance using pre-computed affinities