我有一个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请求。
谢谢
答案 0 :(得分:5)
请不要使用filter
并以if
条件包装HTTP调用:
...
withLatestFrom(...)
mergeMap(([action, allFilters]) => {
if (isEmpty(allFilters)) {
return of(allFilters);
}
return this.simService.getAllFilters()...
})
map((allFilters) => new AllFiltersLoadedAction(allFilters))
我不知道您到底想做什么,但我希望您能明白这一点。