асинхронное ожидание не работает с двумя функциями

#javascript #node.js

#javascript #node.js

Вопрос:

У меня есть функция, которая обращается к базе данных для определения общего объема выбросов для каждого ингредиента. Затем это значение сохраняется в объекте и в базе данных. Однако объект сохраняется до того, как можно будет вычислить итоговые значения выбросов.

 var emission_total = 0;

      async function getEmissionTotal() {
        for (var x in ingredients) {
          Emission.findOne({food_name:ingredients[x]}).then(result => {
            console.log(result);
            if (result == null) {
              emission_total  = 0;
              console.log(emission_total);
            }
            else {
              emission_total  = 0.7;
              console.log(emission_total);
            }
          })
          .catch(err => console.log(err));
        }
        return;
      }
      
      async function next() {
        await getEmissionTotal();
      
        const date = req.body.date; 
        const description = req.body.description; 
        const food_list = ingredients;
        const photo = photo_link;
        const nutrients = {
          'calories': req.body.calories,
          'fat': req.body.fat,
          'sugar': req.body.sugar,
          'carbs': req.body.carbs,
          'cholesterol': req.body.cholesterol,
          'protein': req.body.protein,
          'emissions': emission_total
        }
        
        console.log(nutrients);
          

        const newNutrition = new Nutrition({
          date,
          description,
          photo,
          nutrients,
          food_list
        });

        console.log(newNutrition)

        newNutrition.save()
          .then(() => res.json('Nutrition added!'))
          .catch(err => res.status(400).json('Error: '   err));
     
      }
      next();




  

По сути, функция next() должна выполняться после асинхронной функции getEmissionTotal()

Комментарии:

1. getEmissionTotal() не возвращает ничего, чего нужно ждать

2. внесите emission_total объявление в getEmissionTotal() и затем return emission_total . В next() функции объявите другую переменную const emissionTotal = await getEmissionTotal()

Ответ №1:

emission_total необходимо ввести метод getEmissionTotal. Также вы ничего не возвращаете и не ждете результата.

 async function getEmissionTotal() {
    let emission_total = 0;
    for (var x in ingredients) {
        try {
            const result = await Emission.findOne({food_name:ingredients[x]});
            console.log(result);
            if (result == null) {
                emission_total  = 0;
                console.log(emission_total);
            } else {
                emission_total  = 0.7;
                console.log(emission_total);
            }
      } catch(err) {
          console.log(err);
      }  
   }
   return emission_total;
}