订阅可观察对象后的第一个值始终为空

First value after subscribing observable is always null

我有以下配置文件服务:

export class ProfileService {
  private user: BehaviorSubject<User> = new BehaviorSubject<User>(null);

  constructor(private userService: UserService) { 
    this.userService.getUser(1)
      .pipe(map((payload: Payload<Result>) => payload.result))
      .subscribe((User: user): this.user.next(user));
  }

  public getUser() : Observable<User> {
    return this.user.asObservable();
  } 
}

在一些组件上,我注入了 AuthorizationService 并调用了 authorize 方法:

export class AuthorizationService {

  user$: Observable<User>;

  constructor(private profileService: ProfileService) { 
    this.user$ = this.profileService.getUser();
  }

  authorize(policy: Policy, data: any) : Observable<boolean> {

    this.user$.subscribe(x => console.log(x)); // PROBLEM HERE
    // Remaing code

  }

}

问题
我第一次在 authorize 中使用 console.log 我总是得到 null for user$

知道为什么吗?

您正在使用 BehviourSubject,您使用 null 对其进行初始化,这将始终是第一个发射。如果您想防止这种情况发生,请改用常规 Subject

private user = new Subject<User>();

只要在其上调用 next,它就会发出。

ReplaySubject

private user = new ReplaySubject<User>(1);

通过使用 1 对其进行初始化,它将存储最后一个值并在订阅时发出该值。

注意:使用这两种方法您将无法访问 .value.getValue()