#javascript #angular #firebase #google-cloud-firestore
#javascript #angular #firebase #google-облако-firestore
Вопрос:
Я хочу получить данные баланса из firebase. Но это должно быть в режиме реального времени.
Я пишу код ниже. Вывод на консоль — «Баланс: 0». После этого вывода он получает данные firebase и записывает их. Итак, перед тем, как данные поступают из firebase, код продолжается, и функция get balance возвращает 0. Из-за этого я не могу сравнить баланс. Фактические данные поступают после этого.
checkBalance() {
let balance = this.authService.getBalance()
result = this.authService.getBalance() >= this.price ? true : false
console.log("Balance: " balance);
return resu<
}
AuthService:
getBalance() {
let docRef = this.angularFirestore.collection(`users`).doc(JSON.parse(localStorage.getItem('user')).uid);
docRef.get().toPromise().then(function (doc) {
if (doc.exists) {
console.log(doc.data());
console.log(doc.data().balance);
return parseFloat(doc.data().balance);
} else {
// doc.data() will be undefined in this case
console.log("Doc can not find!");
return 0.0;
}
}).catch(function (error) {
console.log("Error getting document:", error);
return 0.0;
});
return 0.0;
}
Ответ №1:
Оригинальный ответ
Шаги
- Отметьте
getBalance
методasync
и сделайте егоreturn
своим обещанием checkBalance
Метод меткиasync
- Измените первую строку следующим образом:
let balance = await this.authService.getBalance()
Пример
async getBalance() {
const docRef = this.angularFirestore.collection(`users`).doc(JSON.parse(localStorage.getItem('user')).uid);
return docRef.get().toPromise().then(function (doc) {
if (doc.exists) {
console.log(doc.data());
console.log(doc.data().balance);
return parseFloat(doc.data().balance);
} else {
// doc.data() will be undefined in this case
console.log("Doc can not find!");
return 0.0;
}
}).catch(function (error) {
console.log("Error getting document:", error);
return 0.0;
});
}
async checkBalance() {
const balance = await this.authService.getBalance();
const result = balance >= this.price ? true : false;
console.log("Balance: " balance);
return resu<
}
Ссылка на JS
Обновление для Angular 12 или выше
Устаревание toPromise в rxjs 7
Теперь вместо toPromise вы должны использовать lastValueFrom
или firstValueFrom
из rxjs
import { firstValueFrom} from "rxjs";
async getBalance() {
const docRef = this.angularFirestore.collection(`users`).doc(JSON.parse(localStorage.getItem('user')).uid);
return firstValueFrom(docRef.get()).then(function (doc) {
if (doc.exists) {
console.log(doc.data());
console.log(doc.data().balance);
return parseFloat(doc.data().balance);
} else {
// doc.data() will be undefined in this case
console.log("Doc can not find!");
return 0.0;
}
}).catch(function (error) {
console.log("Error getting document:", error);
return 0.0;
});
}
Ссылка на Rxjs
Комментарии:
1. Это работает, спасибо. Я думаю, это из-за расположения await .