#firebase #google-cloud-firestore #angular7
#firebase #google-облако-firestore #angular7
Вопрос:
Я пытаюсь извлечь поле из firebase firestore в проекте angular7, а затем сохранить его в строковой переменной. Мне нужно использовать функцию ‘where’, но это вынуждает меня использовать наблюдаемые, и, будучи новичком в angular, я не могу понять, как извлечь нужную строку.
Я провел исследование, которое привело меня к предоставленному коду, но без успеха в том, чего я хочу достичь. Как опытный разработчик sql, это действительно расстраивает.
getUserPrivilegeByUserId(uid:string){
var data;
this.db.collection('users', ref => { return ref.where('uid','==',uid)}).snapshotChanges().subscribe(result => {
result.forEach(doc =>{
data = doc.payload.doc.get("privileges");
})
}
);
return data;
}
Ответ №1:
Работа с наблюдаемыми является асинхронной, поэтому в вашем примере строка «return data;» будет выполнена задолго до выполнения «data = doc.payload.doc.get(«привилегии»);».
Если метод getUserPrivilegeByUserId() находится в компоненте, подход к решению этой проблемы будет заключаться в том, чтобы установить данные в качестве свойства для компонента, а затем обновить его в subscribe, вот так:
data: string;
...
getUserPrivilegeByUserId(uid:string){
this.db.collection('users', ref => { return ref.where('uid','==',uid)}).snapshotChanges().subscribe(result => {
result.forEach(doc =>{
this.data = doc.payload.doc.get("privileges");
})
}
);
}
Если, с другой стороны, метод getUserPrivilegeByUserId() находится в сервисе, вы могли бы вернуть наблюдаемое из сервиса следующим образом:
import { map } from 'rxjs/operators';
...
getUserPrivilegeByUserId(uid:string): Observable<string>{
return this.db.collection('users', ref => { return ref.where('uid','==',uid)}).snapshotChanges()
.pipe(
map(result => {
var data;
result.forEach(doc =>{
data = doc.payload.doc.get("privileges");
});
return data;
})
);
И затем в вашем компоненте вы сделаете что-то вроде:
data: string;
...
this.userService.getUserPrivilegeByUserId(uid).subscribe(data => this.data = data);
Комментарии:
1. Спасибо, я полностью проигнорировал асинхронную логику, хотя прочитал ее 100 раз.