使用 Indexeddb 作为离线数据存储的 Angular5 HTTP 服务:如何处理 Observable<response> 与 Object

Angular5 HTTP service with Indexeddb as an offline datastore: how to handle Observable<response> vs Object

我有一个 Angular 5 应用程序将数据存储在数据库中,我通过这样的服务调用获取数据:

this.dataSvc
    .getSomeData()
    .map(response => response.json())
    .subscribe(
      data => { this.someVariable = data }
    )

那里的服务基本是这样的:

 public getSomeData(): Observable<Response> {
      return this.http.get(SERVER_URL);
 }

我有一个 indexeddb 服务 运行,当网络可用时,每次我从上面的服务获取数据时,我都会将 returned 数据作为对象保存到 indexeddb 存储中,并且当网络不可用且调用服务时,我想改为从 indexeddb 存储中获取对象 return 而不是通过网络获取。

 if (this.networkStatus == 'Offline') {
      this.idbService.getRecord('idbStore')
      .subscribe(data => {
           console.log("Idb Data: ",data);
           return Observable.of(data);
      }
 } else {
      return this.http.get(SERVER_URL);
 }

问题是 'return Observable.of(data)' 不正确,在组件端网络 return 得到响应,它可以将响应映射到 json 等,但是 indexeddb 调用 returns 一个不能映射到 json 的对象,因为它已经是一个 javascript 对象。

我想在服务级别处理 online/offline 情况 - 我知道我可以在组件中执行此操作,并在有网络时调用在线服务并使用 Observable 形式,并调用没有网络时的离线服务并收到一个 javascript 对象,但其中一些服务在很多组件中使用,我想集中处理 online/offline 条件的代码而不是复制每个组件中的代码。

问题是我如何处理从 indexeddb 存储中获取的对象的 return,以便按照期望 HTTP 响应的代码正确处理它的方式对其进行格式化?

或者,是否有其他/更好的方法来解决隐藏在我盲点中的这个问题?

不要订阅 getRecord() 电话。相反 return 那:

return this.idbService.getRecord('idbStore');

根据您的评论,您将需要:

if (this.networkStatus == 'Offline') 
{
    return this.idbService.getRecord('idbStore');
} else {
    return this.http.get(SERVER_URL)
        .map(response => response.json());
}

并将另一部分更改为:

this.dataSvc
    .getSomeData()
    .subscribe(data => {
        this.someVariable = data;
    });