转换为rxjs的方法论

我想把以下2个方法转换成rxjs方法。如何才能做到这一点。第二种方法是以第一种方法的结果为基础的。

export class EntityStorage {
  private entitiesStore: Map<string, any[]> = new Map<string, any[]>();

  constructor(private apiService: ApiService) {}

  loadAllEntity(key: string, httpParams: HttpParams): void {
    this.apiService.getEntities(key, httpParams).subscribe(
      (entities) => {
        this.entitiesStore.set(key, entities);
      },
      (error) => {
        console.error(error);
      },
      () => {}
    );
  }

  getStoreWithKey(key: string): any[] {
    return this.entitiesStore.get(key);
  }
}

解决方案:

我会这样做。

export class EntityStorage {
  private setEntities = new Subject<[string, any[]]>();
  private entitiesStore = new ReplaySubject<Map<string, any[]>>(1)

  constructor(private apiService: ApiService) {

    this.setEntities.pipe(
      scan((entityMap, [key, entities]) => {
        entityMap.set(key, entities);
        return entityMap;
      }, new Map<string, any[]>())
    ).subscribe(this.entitiesStore)

  }

  loadAllEntity(key: string, httpParams: HttpParams): void {
    this.apiService.getEntities(key, httpParams).subscribe(
      (entities) => {
        this.setEntities.next([key, entities]);
      },
      (error) => {
        console.error(error);
      },
      () => {}
    );
  }

  getStoreWithKey(key: string): any[] {
    return this.entitiesStore.pipe(
      map(entityMap => entityMap.get(key)), 
      filter(entity => !!entity), // optional, prevent emissions until key loaded.
      distinctUntilChanged() // optional. prevents subscribers from receiving updates about different keys.
    );
  }
}

基本上,你使用一个私有的本地主题来触发地图重放主题的更新,并利用扫描对其进行更新。

如果你愿意,甚至可以将加载移动到流中,这将给加载提供更精细的控制,即,不会为同一个键调用实体加载两次(如果这在你的应用程序中是可能的),如果需要,让我知道。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何将公式复制到其他列

2022-9-13 14:18:40

未分类

如何使输入代码与打印代码在同一行[重复]。

2022-9-13 14:29:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索