Возвращаемое значение функций JavaScript - неопределенный снимок из магазина - PullRequest
0 голосов
/ 22 июня 2019

У меня есть следующий код.Возвращаемое значение функции caloriex всегда неопределено.

Когда я показываю значение, возвращаемое непосредственно перед оператором возврата, оно показывает правильное значение.Но когда он возвращается из функции, он не определен.Не могли бы вы помочь мне решить эту проблему?

  function caloriex(calorie, meal){
    let citiesRef = db.collection('food');
    let query = citiesRef.where('category_out', '==', calorie).where('category_in', '==', meal).get()
      .then(snapshot => {
        if (snapshot.empty) {
          console.log('No matching documents.');
        }
        var workingbalance = '';
        snapshot.forEach(doc => {
          console.log(doc.id, '=>', doc.data());//this result is fine
          workingbalance = doc.data().id;
        });
        return workingbalance //returned VALUE is undefined 
      })
      .catch(err => {
        console.log('Error getting documents', err);
      });
  }

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Ваша функция возвращает [обещание объекта], потому что обещание не выполнено, и вы возвращаете значение.Пожалуйста, используйте «await» для вызова функции Firestore.

0 голосов
/ 22 июня 2019

Это потому, что вы никогда не возвращаете ничего из функции. Все, что он делает, это let две переменные, а затем есть множество обратных вызовов от внутренних функций, которые не влияют на возвращение внешней функции. Оператор return workingbalance просто возвращает это значение из внутренней лямбда-функции, которую вы передали тогда then.

Вам нужно будет узнать, как обещания и цепочки обещаний работают в JavaScript, если вы хотите быть эффективными при асинхронном программировании. Если вы хотите передать это значение workingbalance вызывающему, лучшее, что вы можете сделать, это вернуть всю цепочку обещаний и заставить вызывающего использовать then в этом обещании для получения значения. Итак, это будет

return citiesRef.where(...).then(...).catch(...)
...