Получение неопределенного значения для конечной наблюдаемой, которая должна быть сохранена в переменной $ user через switchMap - PullRequest
0 голосов
/ 30 марта 2019

Я надеюсь, что кто-то может помочь мне с этим.Я довольно новичок в мире машинописи и угловых / пожарных, и мне нужно немного помочь.

У меня есть файл 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...