Подписка на Behavior Subject, не работающую с множественными операторами - PullRequest
0 голосов
/ 25 мая 2020

У меня очень уникальная проблема.

Я создал тему поведения в своей службе

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  baseUrl = `${environment.url}`;

  private appUser: BehaviorSubject<User> = new BehaviorSubject(null);

  constructor(private http: HttpClient) {
  }

  setAppUser(user: User) {
    this.appUser.next(user);
  }

  getAppUser() {
    return this.appUser.asObservable();
  }

Я вызываю эту тему поведения из одного из своих компонентов.

Теперь он работает и не работает при других обстоятельствах.

Он работает, если я подписываюсь на такую ​​тему поведения

    export class AppNavComponent implements OnInit {

      user: User;    

      constructor(private router: Router,
        private authService: AuthService) { }

      ngOnInit(): void {
        this.authService.getAppUser()
        .subscribe(user => this.user = user)
      }

Он не работает, если я хочу выполнить несколько операторов после подписки .

export class AppNavComponent implements OnInit {

  user: User;
  userCanViewAdmin: boolean = false;


  constructor(private router: Router,
    private authService: AuthService) { }

  ngOnInit(): void {
    this.authService.getAppUser()
    .subscribe(user => {
      this.user= user;
      this.userCanViewAdmin= this.authService.getUserPermission(user, 'View Admin Page');
    })
  }

Я действительно не понимаю, что я здесь делаю неправильно.

Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Нашел проблему, ребята, Тупой с моей стороны, чтобы не осознавать ее

Ошибка была в моем втором утверждении.

this.userCanViewAdmin= this.authService.getUserPermission(user, 'View Admin Page');

Первоначально тема поведения устанавливает моего пользователя как null, и это служба выдает ошибку, потому что мой пользователь имеет значение NULL.

Мне просто нужно не вызывать указанную выше службу, если пользователь имеет значение NULL.

Спасибо, Квентин Гризель, за то, что дал представление о том, где я ошибся.

Спасибо всем

0 голосов
/ 25 мая 2020

как сказал @Quentin, очень вероятно, что обратный вызов подписки имеет ошибку.

Взгляните на воспроизведенный пример

const appUser = new rxjs.BehaviorSubject(null);
let user = null;

appUser.asObservable().subscribe(data => {
  user = data;
  // your api call
  throw new Error('Test');
})

appUser.next({
  id: 1,
  username: `test`
});

setTimeout(() => {
  console.log(user);
}, 500)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...