JavaScript函数的返回值是来自Firestore的未定义快照

时间:2019-06-22 06:39:02

标签: javascript firebase google-cloud-firestore dialogflow actions-on-google

我有以下代码。函数热量x的返回值始终是不确定的。

当我在return语句之前显示要返回的值时,它显示正确的值。但是,当从函数返回它时,它是不确定的。您能帮我解决这个问题吗?

  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 :(得分:0)

那是因为您从不返回任何函数。它所做的只是let两个变量,然后是来自内部函数的一堆回调,这些回调不影响外部函数的返回。语句return workingbalance只是从您传递的then内部lambda函数返回该值。

如果您想对异步编程有效,则必须学习Promise和Promise链如何在JavaScript中工作。如果您希望将workingbalance的值提供给调用方,则您最好的办法是返回整个诺言链,并使调用方在该诺言上使用then来获取值。因此,它将是

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

答案 1 :(得分:0)

您的函数正在返回[对象诺言],因为未解决诺言,而您正在返回值。请使用“等待”来调用Firestore函数。