rxjs - 是否有 always 运算符?你怎么总是做某事?
rxjs - is there an always operator? how do you always do something?
我有一个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 请求。
谢谢
只是不要使用 filter
并用 if
条件包装 HTTP 调用:
...
withLatestFrom(...)
mergeMap(([action, allFilters]) => {
if (isEmpty(allFilters)) {
return of(allFilters);
}
return this.simService.getAllFilters()...
})
map((allFilters) => new AllFiltersLoadedAction(allFilters))
我不知道你到底想做什么,但我希望你能明白这一点。
我有一个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 请求。
谢谢
只是不要使用 filter
并用 if
条件包装 HTTP 调用:
...
withLatestFrom(...)
mergeMap(([action, allFilters]) => {
if (isEmpty(allFilters)) {
return of(allFilters);
}
return this.simService.getAllFilters()...
})
map((allFilters) => new AllFiltersLoadedAction(allFilters))
我不知道你到底想做什么,但我希望你能明白这一点。