Отказаться от подписки не работает, когда выход в угловой и пожарной базе - PullRequest
0 голосов
/ 03 апреля 2019

Я использую Angular 7, Firebase ( Только для аутентификации ) и mysql ( Для сохранения других данных ).Как только пользователь вошел в систему, запрос получает данные пользователя из mysql и сохраняет их в localStorage.Когда я выхожу, происходит его выход, но опять-таки запрос (this.userService.findByUsername(res.user.uid).subscribe(....)) отправляет и возвращает данные и сохраняет их в локальном хранилище.Отписываюсь при выходе.Но это не работает.(Немного других переменных и методов удалены в следующих кодах для упрощения)

export class AuthService {
    private subscription: Subscription = new Subscription();
    user: Observable<firebase.User>;
    private currentUserSubject: BehaviorSubject<User | null>;
    authState: any = null; 

    constructor(private firebaseAuth: AngularFireAuth, private router: Router, private userService:UserService) {
        this.user = firebaseAuth.authState;
        this.subscription.add(this.firebaseAuth.authState.subscribe((auth) => {
        this.authState = auth;

        //getting the user object if he already signed-in
        this.currentUserSubject = new BehaviorSubject<User>(localStorage.getItem('currentUser') | null);        
        this.currentUser = this.currentUserSubject.asObservable();
    }))

    signin(email: string, password: string) {      
        return new Promise<any>((resolve, reject) => {
            // --- login with email and password in firebase
            this.firebaseAuth.auth.signInWithEmailAndPassword(email, password)
            .then(
                res => {                                     
                    // --- Once login is successful, get the user object form the backend
                    this.subscription =this.userService.findByUsername(res.user.uid).subscribe(data=>{                               
                        this.currentUserSubject.next(data);                                                 
                        localStorage.setItem("currentUser", JSON.stringify(data));   
                        resolve(this.firebaseAuth.auth.currentUser); 
                    })
            } ,
                err => {reject(err); }
            ).catch(err => {
                console.log('Something went wrong:', err.message);
            });
    });

    }

    async logout() {        
        await this.firebaseAuth.auth.signOut().then(()=>{
            this.currentUserSubject.next(null);
            this.currentUserSubject.complete();
            this.subscription.unsubscribe()
            localStorage.removeItem('currentUser');       
            this.router.navigate(['/signin']);
        })
    }
}

1 Ответ

1 голос
/ 03 апреля 2019

попробуйте использовать оператор first() следующим образом, чтобы гарантировать, что только одно значение будет достигнуто при подписке.

this.userService.findByUsername(res.user.uid).pipe(first()).subscribe(...)
...