使用 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;
});
我有一个 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;
});