Работа с Observables является асинхронной, поэтому в вашем примере это «возврат данных»;строка будет выполнена задолго до того, как «data = doc.payload.doc.get (« привилегии »);»
Если метод getUserPrivilegeByUserId () находится в компоненте , то для решения этой проблемы необходимо установить данные как свойство компонента, а затем обновить его в подписке., например:
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 () находится в службе , вы можете вернуть Observable из службы следующим образом:
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);