rxjs-是否存在始终运算符?你怎么总是做某事?

时间:2018-07-21 22:30:03

标签: angular rxjs ngrx rxjs6

我有一个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))
)

如果商店已被填充(因为API的数据不变),我正在使用filter来防止发出HTTP请求(请参阅mergeMap

但是,我总是要执行:

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

无论是否发出HTTP请求。但是,它无法在mergeMap之前执行,因为mergeMap确保allFilters数据可用。

是否有任何RxJS always do this类型的运算符?如果没有,我应该如何重构此代码以实现我想要的?

目前,唯一的解决方案是删除filter,但这将导致发出不必要的HTTP请求。

谢谢

1 个答案:

答案 0 :(得分:5)

请不要使用filter并以if条件包装HTTP调用:

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

我不知道您到底想做什么,但我希望您能明白这一点。