我正在尝试实现共享服务,以便在组件之间共享信息。
在这一刻,订阅不起作用,我不知道为什么......
这是服务:
private subject = new Subject<any>();
getCurrentUser(): Observable<any>
{
this.subject.next({data:"test"});
return this.subject.asObservable();
}
subscription: Subscription;
ngOnInit() {
this.subscription = this.authService.getCurrentUser().subscribe(data => {
this.message = data;
alert('I called the method');
});
}
此时执行没有进入设置消息的过程并执行警报...
感谢支持
答案 0 :(得分:3)
那是因为你没有按照它使用的方式使用Observable
,Observable
基本上是一个数据流,而你&#39 ;在订阅流之前重新发出数据。
private subject = new Subject<any>();
getUserObservable(): Observable<any>
{
return this.subject.asObservable();
}
setUser(user:any):void{
this.subject.next(user);
}
在你的测试中:
订阅:订阅;
ngOnInit() {
this.subscription = this.authService.getCurrentUserObservable().subscribe(data => {
this.message = data;
alert('I called the method');
});
// The subscription will be called right here.
this.authService.setUser({data:"test"});
}
然后,如果您从其他组件,服务或其他内容中调用setUser
,您的订阅将被调用。
答案 1 :(得分:1)
您的主题在您订阅之前会发出该值。这就是一个主题如何运作。您可以使用BehaviorSubject
。 BehanvoirSubject重新发送该值,但采用默认值:
private subject = new BehaviorSubject<any>(undefined);
如果那不是您想要的,您可以使用地图:
return this.subject.asObservable().map(value => !isNullOrUndefined(value))
答案 2 :(得分:1)
在您的示例/测试中尝试将主题更改为BehaviorSubject
private subject = new BehaviorSubject<any>({date: "test"});
然后将getCurrentUser更改为
getCurrentUser(): Observable<any> {
return this.subject.asObservable();
}
subject和behaviorSubject之间的一个重要区别是你必须为behaviorSubject提供一个起始值,并且当你订阅它时它也会向你发出当前值。当您订阅时,主题不会向您发出最后设定值,它只会在您订阅的点开始“观察”并接收后续更改。