我目前正在以这种方式获取新的更新的用户值:
this.Service.user$.subscribe(data => {
this.userData = data;
this.userId = data._id;
});
,但updateUser仅每5秒执行一次。
因此,userData
和UserId
在加载之前为空。
有没有办法我可以从服务中已有的内容中获取存储的用户数据,而不是等待5秒钟再次执行操作?
类似:
this.Service.user$().GET((data:any) => { // gets the value already stored
});
我该怎么做?
服务代码:
user$: Observable<any>;
constructor(private http: HttpClient, private router: Router) {
this.user$ = this.userChangeSet.asObservable();
}
updateUser(object) {
this.userChangeSet.next(object);
}
编辑:
此外,我如何记录所有ngOnDestroy
事件的订阅?
答案 0 :(得分:1)
将BehaviorSubject用于userChangeSet。订阅后立即产生价值。 示例:
userChangeSet = new BehaviorSubject<any>(this.currentData);
答案 1 :(得分:1)
您可以在服务中做的是在内部使用BehaviourSubject 存储值,但将其公开为Observable。
这是文档中的引文,详细说明了BehaviourSubject是什么
BehaviorSubject是Subject的一种变体,它的概念是“当前值”。 它存储释放给消费者的最新价值,并且 每当有新的观察者订阅时,它将立即从BehaviorSubject接收“当前值”
有关更多信息,请参见here。
服务代码:
private _user$ = new BehaviourSubject<any>(null); // initially null
constructor(private http: HttpClient, private router: Router) {
this.userChangeSet.subscribe(val => this._user$.next(val))
}
get user$ () {
return this._user$.asObservable();
}
然后,您可以在组件中像正常使用它。
this.service.user$.subscribe(v => {
// do stuff here
})
请注意第一个值 组件将获取的值将为null,因为这是的初始值 行为主题。
编辑:
在组件中
private _destroyed$ = new Subject();
public ngOnDestroy (): void {
this._destroyed$.next();
this._destroyed$.complete();
}
然后进行订阅
this.service.user$.pipe(
takeUntil(this._destroyed$)
).subscribe(v => {
// do stuff here
})
此方法的工作方式是,当被销毁的$主题发出时,已管道传输takeUntil(this._destroyed$)
的可观察对象将退订各自的来源。