重新执行前从Observable获取价值

时间:2019-03-18 01:08:27

标签: javascript angular service observable

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

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

编辑:

此外,我如何记录所有ngOnDestroy事件的订阅?

2 个答案:

答案 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$)的可观察对象将退订各自的来源。