我有以下代码。函数热量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);
});
}
答案 0 :(得分:0)
那是因为您从不返回任何函数。它所做的只是let
两个变量,然后是来自内部函数的一堆回调,这些回调不影响外部函数的返回。语句return workingbalance
只是从您传递的then
内部lambda函数返回该值。
如果您想对异步编程有效,则必须学习Promise和Promise链如何在JavaScript中工作。如果您希望将workingbalance
的值提供给调用方,则您最好的办法是返回整个诺言链,并使调用方在该诺言上使用then
来获取值。因此,它将是
return citiesRef.where(...).then(...).catch(...)
答案 1 :(得分:0)
您的函数正在返回[对象诺言],因为未解决诺言,而您正在返回值。请使用“等待”来调用Firestore函数。