在重新执行之前从Observable获取值

问题描述 投票:0回答:2

我目前正在以这种方式获得新的更新用户值:

 this.Service.user$.subscribe(data => {
      this.userData = data;
      this.userId = data._id;
    });

但updateUser仅每5秒执行一次。

因此在加载之前,userDataUserId是空的。

有没有办法我可以从服务中已经存在的用户数据中获取存储的用户数据,而不是等待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);
  }

编辑:

另外,我如何在qazxsw poi事件中摧毁所有订阅者?

javascript angular service observable
2个回答
1
投票

您可以在服务中执行的操作是在内部使用BehaviourSubject来存储值,但将其公开为Observable。

以下是详细介绍BehaviourSubject内容的文档的引用

Subjectsubject的一个变体是BehaviorSubject,它具有“当前值”的概念。它存储发布给消费者的最新值,每当新的Observer订阅时,它将立即从BehaviorSubject接收“当前值”

有关更多信息,请参阅ngOnDestroy

服务代码:

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();
}

请注意,组件将获得的第一个值将为null,因为这是BehaviourSubject的初始值。

编辑:

在组件中

this.service.user$.subscribe(v => {
  // do stuff here
})

然后是订阅

private _destroyed$ = new Subject();

public ngOnDestroy (): void {
    this._destroyed$.next();
    this._destroyed$.complete();
}

这种方法的工作方式是当被破坏的$ subject发出时,使用管道this.service.user$.pipe( takeUntil(this._destroyed$) ).subscribe(v => { // do stuff here }) 的可观察者将取消订阅他们各自的来源。


1
投票

对于userChangeSet使用BehaviorSubject。它会在订阅后立即发出价值。例:

takeUntil(this._destroyed$)
© www.soinside.com 2019 - 2024. All rights reserved.