如何调用两次在ngrx效果中调用的服务?
Posted
技术标签:
【中文标题】如何调用两次在ngrx效果中调用的服务?【英文标题】:How to call twice a service that is called in a ngrx effect? 【发布时间】:2020-01-20 22:51:10 【问题描述】:我有一个正在监听一个动作的效果,这个效果是调用一次 api(检索 10 部随机电影)一次,这是正常行为,但我想调用同一个服务两次。
loadMovies$ = createEffect(() => this.actions$.pipe(
ofType('[Movies Page] Load 20 Movies'),
mergeMap(() => this.moviesService.getTenRandomMovies()
.pipe(
map(movies => ( type: '[Movies API] 10 Movies Loaded Success', payload: movies )),
catchError(() => EMPTY)
))
)
);
我正在考虑这个解决方案,但看起来很奇怪。如果这是唯一的可能性,请告诉我。
dispatchTwiceGetAuthQuestions$ = createEffect(() =>
this.actions$.pipe(
ofType('[Movies Page] Load 20 Movies'),
tap(() =>
this.store.dispatch(new LoadTenRandomMovies());
),
tap(() =>
this.store.dispatch(new LoadTenRandomMovies());
)
)
);
loadMovies$ = createEffect(() => this.actions$.pipe(
ofType('[Movies Page] Load 10 Movies'),
mergeMap(() => this.moviesService.getTenRandomMovies()
.pipe(
map(movies => ( type: '[Movies API] 10 Movies Loaded Success', payload: movies )),
catchError(() => EMPTY)
))
)
);
注意:无法更新后端。
【问题讨论】:
这个问题有什么更新吗? 【参考方案1】:使用 forkJoin 就足够了
loadMovies$ = createEffect(() => this.actions$.pipe(
ofType('[Movies Page] Load 10 Movies'),
switchMap(() =>
forkJoin([
this.moviesService.getTenRandomMovies(),
this.moviesService.getTenRandomMovies()
])
.pipe(
map(([response1,response2]) =>
// do something
),
map(movies => ( type: '[Movies API] 10 Movies Loaded Success', payload: movies
)),
catchError(() => EMPTY)
))
)
);
【讨论】:
【参考方案2】:你可以写一个新函数moviesService.getRandomMovies(pagesToGet: int)
let observables: any[] = [];
for (let i = 0; i < pagesToGet; i ++)
observables.push(this.getTenRandomMovies());
return forkJoin(observables)
.pipe(map(results => results.flat()))
【讨论】:
以上是关于如何调用两次在ngrx效果中调用的服务?的主要内容,如果未能解决你的问题,请参考以下文章