代码之家  ›  专栏  ›  技术社区  ›  danday74

rxjs-是否始终有一个运算符你总是怎么做?

  •  1
  • danday74  · 技术社区  · 6 年前

    我有一个ngrx效果(大量使用rxjs)如下:

    @Effect()
    allFiltersRequested$ = this.actions$.pipe(
      ofType<AllFiltersRequestedAction>(FiltersActionTypes.AllFiltersRequested),
      tap((action) => debug(action)),
      withLatestFrom(this.store.pipe(select(selectAllFilters))),
      filter(([action, allFilters]) => isEmpty(allFilters)),
      mergeMap(() =>
        this.simService.getAllFilters().pipe(
          catchError(() => {
            return of({})
          })
        )
      ),
      map((allFilters) => new AllFiltersLoadedAction(allFilters))
    )
    

    我在用 filter 防止发出HTTP请求(请参见 mergeMap )如果存储已填充(因为来自API的数据没有更改)

    但是,我总是想执行:

    map((allFilters) => new AllFiltersLoadedAction(allFilters))
    

    不管是否发出了HTTP请求但是它不能在 合并映射 因为 合并映射 确保 allFilters 数据可用。

    有RXJ吗 always do this 键入运算符?如果不是,我应该如何重构这些代码来实现我想要的目标?

    目前,唯一的解决办法是 滤波器 但这将导致不必要的HTTP请求。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  5
  •   martin    6 年前

    只是不用 filter 并用 if 条件:

    ...
    withLatestFrom(...)
    mergeMap(([action, allFilters]) => {
      if (isEmpty(allFilters)) {
        return of(allFilters);
      }
      return this.simService.getAllFilters()...
    })
    map((allFilters) => new AllFiltersLoadedAction(allFilters))
    

    我不知道你到底想做什么,但我希望你能明白。