订阅数据服务中保存的可观察数据

Subscribe to observable data held in dataservice

我有一个 ionic 4 应用程序,它可以从端点检索故障。我想将数据保存在服务上的 属性 中。

所以我可以在多个屏幕上访问列表,这也意味着每次加载第一个屏幕时我不必重新加载列表

我的故障服务如下。我调用 updateFaults 检索故障并将它们存储在 this.faults.

export class FaultsService {

  private selectedFault: Fault;
  public faults: Fault[];

    constructor(private http: HttpClient) {}

   updateFaults() {
       this.http.get<Fault[]>('/api/faults').subscribe((data: any) =>
       {
         this.faults = data.data
       })
    }

    getFaultObservable() : Observable<Fault[]>
    {
      return of(this.faults)
    }

}

在我的页面 ngOnInit 我有这个方法 :

ngOnInit() {
    this.faultsService.getFaultObservable().subscribe((faults: Fault[]) =>{
        console.log('update faults')
      this.faults = faults
      }
    )

但是当我加载页面时,虽然没有报错。什么都不显示, console.log 也没有触发。所以我不确定我是否正确订阅了。

这可能是更好的方法,这样您就不必调用更新。您可以只缓存第一次,然后 return 每次都缓存。我添加了一个无效缓存,以防你有时想这样做。

export class FaultsService {

  private selectedFault: Fault;
  private faults: Fault[];

    constructor(private http: HttpClient) {}

    getFaultObservable() : Observable<Fault[]>
    {
      if(this.faults) {
          return of(this.faults)
      }


      return this.http.get<Fault[]>('/api/faults').pipe(
   tap(data => this.faults = data.data)
      )
    }

    invalidateCache() {
       this.faults = null;
    }

}

该服务可以缓存检索到的项目,然后 return 使用 of. The service itself can cache the result of the call using tap.

将这些项目缓存到包含在可观察对象中的任何后续调用

您应该将缓存从调用者中抽象出来,以便将检索保留为 1 个方法。调用者然后调用 getFaults() 并订阅 returned 可观察对象。对来电者来说是第1次还是第10次都无所谓

import { map, tap } from 'rxjs/operators';
import { of } from 'rxjs';

export class FaultsService {

  faults: Fault[];

  constructor(private http: HttpClient) {}

  getFaults() : Observable<Fault[]> {
    return this.faults
        ? of(this.faults)
        : this.http.get<{data: Fault[]}>('/api/faults')
              .pipe(tap((data) => this.faults = data.data) // cache
                  , map((data) => data.data)); // return just Fault[] from data.data to the subscriber
    }
}