使用 Indexeddb 作为离线数据存储的 Angular5 HTTP 服务 : how to handle Observable<response> vs Object

标签 angular http indexeddb angular2-observables

我有一个 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服务,当网络可用时,每次从上面的服务获取数据时,我都会将返回的数据作为对象保存到indexeddb存储中,当网络不可用时,调用服务后,我想从 indexeddb 存储中获取对象并返回它,而不是通过网络获取。

 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)”不正确,在组件端,网络返回得到响应,并且它可以将响应映射到 json 等,但是 indexeddb 调用返回一个无法映射到 json 的对象,因为它已经是一个 javascript 对象。

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

问题是如何处理从 indexeddb 存储中获取的对象的返回,以便将其格式化为期望 HTTP 响应的代码能够正确处理它?<​​/p>

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

最佳答案

不要订阅 getRecord() 调用。相反,返回:

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

关于使用 Indexeddb 作为离线数据存储的 Angular5 HTTP 服务 : how to handle Observable<response> vs Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49887064/

相关文章:

javascript - Angular - 当传递返回 es6 字符串的函数时,ngStyle 返回 [object Object]

javascript - 如何在表单中传递隐藏值?

javascript - 在heroku上运行 Angular 应用程序时出现应用程序错误

android - Liveprofile、推送通知、结构

javascript - Multi-Device-Hybrid-Apps - 有谁获得了适用于 android 的 indexeddb 插件吗?

javascript - Angular 路线不起作用并且不改变当前 View

javascript - 与 postman rest 客户端相比,nodejs/curl http 请求速度较慢

javascript - 加快图像下载时间

javascript - Safari 私有(private)模式下 indexedDB 和 localstorage 的最佳后备方案是什么

firefox - 从 Web Workers 访问 IndexedDB