订阅可观察对象后的第一个值始终为空
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()
我有以下配置文件服务:
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()