0

我有一个 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(如果它试图从服务器获取它)。我想得到同样的想法,只是所有的值都将被解析(缓存和新获取的)。值得一提的是,当我在缓存中拥有所有数据时,我得到的地图正是我想要的,所以问题在于获取和解析部分。

我怎样才能正确地做到这一点?此外,我们很乐意接受对此代码的任何改进。

4

1 回答 1

0

我将在这里简化问题和答案。如果您需要更多信息,请告诉我。

private cache = {};

public getData(ids: string[]){
    return Observable.from(ids)
        .flatMap((id: string)=>
            this.cache[id] ?
                Observable.of({id: this.cache[id]}) :
                this.http.get(url, {id: id })
                    .map(res => { id: res.json()})
                    .do(data => Object.assign(
                        this.cache,data }
                     )
            }
        )
        .reduce(Object.assign, {});
}
于 2017-06-20T13:05:39.473 回答