在单个nodejs路由中有太多的承诺



我想知道如果其中一个承诺失败,我如何回滚或取消已经发生的操作。

和第二个是有任何其他的方法来优化代码,需要更多的时间来解决。

随着加入玩家数量的增加,它将花费更多的时间,有没有办法优化它更多

route.put("/UpdateResult/:id", Get_User_id, async (req, res) => {
try {
const response = await tournamentschema.findByIdAndUpdate(
req.params.id,
{
Game_Name: req.body.Game_Name,
Total_Players: req.body.Total_Players,
Prize_Pool: req.body.Prize_Pool,
Joined_User: req.body.Joined_User,
Is_Finished: true,
},
{ new: true, runValidators: true }
);
response.Joined_User.forEach(async (Player) => {
await UserModal.findByIdAndUpdate(
Player.UserId,
{
$inc: {
Wallet_Coins: Player.Kills * parseInt(response.Prize_Pool),
},
},
{ new: true }
);
});
return res.send("Result Updated Sucessfully");

} catch (error) {
console.log(error.message);
res.status(500).send(error.message);
}
});

for optimize:在ES7和es8中我们有一个新特性叫做promise针对你的问题最好不要在await函数中使用forEach最好先在新数组中获取所有id,就像这样:

let playerCacheId = []
response.Joined_User.forEach((Player) => { 
playerCacheId.push(player.id)
}
await Promise.all(playerCacheId .map(playerId => UserModal.findByIdAndUpdate(
playerId ,
{
$inc: {
Wallet_Coins: Player.Kills * parseInt(response.Prize_Pool),
},
},
{ new: true }
);
});
))

回滚操作使用MongoDB事务

最新更新