У меня есть следующий код. Возвращаемое значение функции caloriex всегда не определено.
Когда я показываю возвращаемое значение непосредственно перед оператором 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.info('No matching documents.');
}
var workingbalance = '';
snapshot.forEach(doc => {
console.info(doc.id, '=>', doc.data());//this result is fine
workingbalance = doc.data().id;
});
return workingbalance //returned VALUE is undefined
})
.catch(err => {
console.info('Error getting documents', err);
});
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это потому, что вы никогда ничего не возвращаете из функции. Все, что он делает, это let две переменные, а затем есть куча обратных вызовов от внутренних функций, которые не влияют на возврат внешней функции. Оператор return workingbalance просто возвращает это значение из внутренней лямбда-функции, которую вы передали затем then.
Вам нужно будет узнать, как обещания и цепочки обещаний работают в JavaScript, если вы хотите эффективно использовать асинхронное программирование. Если вы хотите передать это значение workingbalance вызывающей стороне, лучшее, что вы можете сделать, это вернуть всю цепочку обещаний и заставить вызывающую сторону использовать then в этом обещании, чтобы получить значение. Итак, это будет
return citiesRef.where(...).then(...).catch(...)
Так должно быть return citiesRef.where(...).get().then(...).catch(...)
Ваша функция возвращает [объектное обещание], потому что обещание не разрешено, и вы возвращаете значение. Пожалуйста, используйте «ожидание» для вызова функции Firestore.
Привет, я пытался. но я получаю результат [обещание объекта].