我正在尝试在异步函数中使用 while 循环,我怀疑我的 resolve();
弄乱了循环,但我不确定该怎么做。这是我的代码:
app.get("/meal-plan", async function(req, res) {
var calorieCount = req.query.calorieCount;
var mealInput = parseInt(req.query.mealInput);
var dietInput = req.query.food;
var goalPerMeal = (calorieCount / mealInput);
var whichDiet = "diet." + dietInput;
var breakfastGoal = goalPerMeal;
var breakfastArr = [];
async function getBreakfastArr() {
return new Promise((resolve, reject) => {
var breakfastQuery = {"breakfast": true, [whichDiet]: true};
while (breakfastGoal >= 150) {
Food.count(breakfastQuery, function(err, count) {
if (err) {
console.log(err);
} else {
var random = Math.floor(Math.random() * count);
Food.findOne(breakfastQuery).skip(random).exec(
function(err, result) {
if (err) {
console.log(err);
} else {
breakfastGoal -= result.nutrition.calories;
breakfastArr.push(result);
resolve();
}
});
}
})
}
});
}
try {
await getBreakfastArr();
console.log(breakfastArr);
res.render("meal-plan.ejs", { meal: mealInput, calories: calorieCount, diet: dietInput, breakfast: breakfast, lunch: lunch, dinner: dinner, totalCalories: totalCalories});
} catch (e) {
res.json(e);
}
});
goalPerMeal
变量接受用户卡路里输入并将其除以他们在我的表格中选择的膳食数量。然后,我将该值设置为名为 breakfastGoal
的特定早餐变量。异步函数从我的数据库中找到一个随机食谱并将其添加到我的数组 breakfastArr
。一旦找到食谱,它就会从 breakfastGoal
中减去该食谱的卡路里计数。
我希望此函数一直运行,直到 breakfastGoa
l 降低到 150 以下;但是,它似乎不起作用。如果我删除 while 循环,该函数将成功找到早餐项目,将其添加到数组中,并从 breakfastGoal
中减去它的卡路里计数。唯一打破它的是添加 while 循环。
这是否与异步函数中的 resolve();
有关,还是我遗漏了一些重要的东西?
非常感谢任何帮助。
最佳答案
你认为这样的事情会奏效吗?我没有测试过这个。只是一个想法。 将 while block 放在 else block 中并递归调用。
async function getBreakfastArr() {
let breakfastQuery = { "breakfast": true, [whichDiet]: true };
return this.getRandomRecipe(breakfastQuery).then((response)=>{
return response; //the response will have your breakfast goal
});
}
async function getRandomRecipe(breakfastQuery) {
return Food.count(breakfastQuery, function (err, count) {
if (err) {
console.log(err);
} else {
var random = Math.floor(Math.random() * count);
Food.findOne(breakfastQuery).skip(random).exec(
function (err, result) {
if (err) {
console.log(err);
} else {
breakfastGoal -= result.nutrition.calories;
breakfastArr.push(result);
while (breakfastGoal >= 150) {
this.getRandomRecipe(breakfastQuery);
}
return Promise.resolve(breakfastGoal);
}
});
}
})
}
关于javascript - 在异步函数中使用 While 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53925547/