由于缺乏异步编程经验,在 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
我尝试了很多方法,但没有任何效果。帮助函数
您不能真正将 forEach
与 await
一起使用,您需要改为:
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;
}));
你会得到你想要的。
我想谈谈与 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
我尝试了很多方法,但没有任何效果。帮助函数
您不能真正将 forEach
与 await
一起使用,您需要改为:
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;
}));
你会得到你想要的。