javascript - 在异步函数中使用 While 循环?

标签 javascript node.js mongodb async-await

我正在尝试在异步函数中使用 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 中减去该食谱的卡路里计数。

我希望此函数一直运行,直到 breakfastGoal 降低到 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/

相关文章:

javascript - 如何使异步事件处理程序按特定顺序工作?

javascript - Facebook Graph API 好友的姓名和 ID

javascript - 解析 json 时遇到问题

mongodb - 如何从 1 分钟嵌套数组数据(mongodb、 Mongoose )聚合 OHLC 5 分钟

mongodb - Mongoose 鉴别器行为

mongodb - Wildfly 8 中用于 CDI 的自定义 jndi 对象工厂

javascript - FormArray - 如何将字符串数组传递给它?

javascript - Angular js错误: [$injector:modulerr] Failed to instantiate module ngroute due to:

javascript - 操作完成后杀死所有 Node 集群工作人员

php - MongoDB(Mongoose 和 Mongo 客户端 PHP)在 concat 字段中搜索