我有一个 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/