Я надеюсь, что кто-то может помочь мне с этим.Я довольно новичок в мире машинописи и угловых / пожарных, и мне нужно немного помочь.
У меня есть файл auth.service, который просматривает состояние пользователя, вошедшего в систему.Как только будет подтверждено, что пользователь вошел в систему, он просмотрит свои пользовательские утверждения.Если есть специальная претензия «брокер», он будет искать коллекцию брокеров пожарного магазина, чтобы получить информацию этого брокера, включая роли, назначенные в пожарном магазине.
Я понимаю, что, возможно, я могу выполнять ролевые операции, используя собственные заявки, но я хочу иметь возможность получать данные из хранилища для получения дополнительной информации и т. Д.
В любом случае, по какой-то причине, я продолжаюполучение неопределенного значения для конечной наблюдаемой, которая должна быть сохранена в переменной $ user.
Я предполагаю, что это как-то связано с задержкой ответа от пожарного магазина.Хотя я использую асинхронные операторы ожидания везде.Пожалуйста, обратитесь к коду в этом сообщении.
Может кто-нибудь помочь мне с этим и сказать, что происходит?Я буду очень благодарен.
Еще одна странная вещь заключается в том, что оператор if внутри блока try {} внутри switchMap продолжает выполняться и возвращаться несколько (три) раза.Пожалуйста, обратитесь к моему скриншоту после этого сообщения.
Не уверен, что я там не так делаю.Буду очень признателен за любую помощь в этом.
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import * as firebase from 'firebase/app';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestoreDocument, AngularFirestore } from 'angularfire2/firestore';
// import { User } from 'firebase';
import { User } from '../models/User.model';
import { switchMap, first, take } from 'rxjs/operators';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/mergeMap';
import { useAnimation } from '@angular/animations';
import { Observable } from 'rxjs';
import { of } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthService {
// user: User;
user$: Observable<any>;
isBroker: boolean;
error: any;
constructor(public afAuth: AngularFireAuth, public router: Router, private afs: AngularFirestore) {
/****
* If the user is logged in, we add the user's data to the browser's local storage; otherwise we store a null user
*****/
// const user = this.isLoggedIn();
// console.log(user);
// afAuth.auth.signOut();
// console.log('I am out');
this.user$ = this.afAuth.authState.pipe(switchMap(async user => {
/**
* If a logged in user exists, check if the custom claim is broker, then look up in brokers collection
* else check in clients collection
*/
try {
if (user) {
//console.log(this.user$);
console.log(user.email);
await user.getIdTokenResult().then(async idTokenResult => {
if (idTokenResult.claims.broker) {
console.log('broker logged in');
const brokerData$ = await this.afs.doc<User>(`brokers/${user.email}`).valueChanges();
brokerData$.subscribe(broker => {
console.log(broker);
})
return brokerData$;
} else if (idTokenResult.claims.user) {
return this.afs.doc<User>(`clients/${user.email}`).valueChanges();
}
});
} else {
console.log('no user');
return of(null);
}
} catch (e) {
console.log(e);
}
}));
this.user$.subscribe(user => {
console.log(user);
})
}
async getBrokerData(uid) {
console.log(uid);
const brokerData$ = await this.afs.doc<User>(`brokers/uid`).valueChanges();
brokerData$.subscribe(broker => {
console.log(broker);
})
// console.log(brokerData$);
return brokerData$;
}
/***
* Method to login users with email and password
*/
async emailLogin(email: string, password: string) {
try {
await this.afAuth.auth.signInWithEmailAndPassword(email, password);
this.router.navigate(['/dashboard']);
} catch (e) {
// alert('Error! ' + e.message);
this.error = e.message;
}
}
async loginGoogle() {
try {
await this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()).then(
(success) => {
this.router.navigate(['/dasboard']);
});
} catch (e) {
alert('Error!' + e.message);
}
}
async loginFb() {
try {
await this.afAuth.auth.signInWithPopup(new firebase.auth.FacebookAuthProvider()).then(
(success) => {
this.router.navigate(['/dasboard']);
});
} catch (e) {
alert('Error!' + e.message);
}
}
async logout() {
await this.afAuth.auth.signOut();
//localStorage.removeItem('user');
this.router.navigate(['']);
}
// get isLoggedIn(): boolean {
// const user = JSON.parse(localStorage.getItem('user'));
// return user !== null;
// }
async isLoggedIn() {
return await this.afAuth.authState.pipe(first()).toPromise();
}
get getAuthState() {
return this.afAuth.authState;
}
}
пользователь $ observable должен быть загружен данными из пожарного магазина.Но по какой-то причине он продолжает называться неопределенным.
Ответ, который я вижу в консоли, выглядит следующим образом.
![How my console looks at the moment](https://i.stack.imgur.com/zV6Vv.jpg)