我有一个 ID 数组,对于每个 ID,我想检查它的数据是否存储在本地缓存中(如果是,则获取)或不存储(从服务器获取)。在该过程结束时,我想获得一张地图,女巫拥有所有 ID 及其解析的数据。
到目前为止,我尝试的每件事都没有满足我的要求.. 我设法做的最接近的事情是:
return this.userGroups$
.switchMap(userGroupsSet => Observable.from(userGroupsSet[GROUP_LIST_TYPE[groupType]])
.mergeMap(groupID => Observable.of(this.getGroupByID(<string>groupID, groupType)
.map(groupData => {
return {[<string>groupID]: groupData}
})
.catch(e => Observable.empty())))
.combineAll()
.map(groupsArray => {
let groupsMap: Map<string, IGroupData> = new Map();
for (let index in groupsArray) {
let groupID = Object.keys(groupsArray[index])[0];
groupsMap.set(groupID, groupsArray[index][groupID])
}
return groupsMap;
})
)
getGroupByID(groupID: string, groupType: GROUP_LIST_TYPE): Observable<any> {
return this.userGroups$
.switchMap(userGroups => {
if (userGroups['groupsData'].has(groupID))
return Observable.of(userGroups['groupsData'].get(groupID));
else
return this.fetchSingleGroupData(groupID, groupType)
.map(groupData => groupData)
.catch(e => Observable.throw(e)
)
})
}
private fetchSingleGroupData(groupID: string, groupListType: GROUP_LIST_TYPE): Observable<any> {
return this.http.get(URLS.AB_STATIC + "groups/" + groupID + ".json", false)
.do(groupData => {
this.userGroups$.dispatch({
type: GROUPS_ACTIONS.CACHED_GROUP_DATA_FETCHED,
payload: {
groupID: groupID,
groupData: groupData.json()
}
});
})
.map(res => res.json())
.catch(e => {
if (groupListType != null)
this.userGroups$.dispatch({
type: GROUPS_ACTIONS.REMOVE_ID_FROM_LIST,
payload: {
groupID: groupID,
groupList: groupListType
}
});
return Observable.throw(e)
})
};
在上面的代码中,订阅者得到一个映射,键是组 ID,值是组数据(如果它存储在缓存中)或未解析的 observable(如果它试图从服务器获取它)。我想得到同样的想法,只是所有的值都将被解析(缓存和新获取的)。值得一提的是,当我在缓存中拥有所有数据时,我得到的地图正是我想要的,所以问题在于获取和解析部分。
我怎样才能正确地做到这一点?此外,我们很乐意接受对此代码的任何改进。