Как дважды вызвать сервис, который вызывается в эффекте ngrx? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть эффект, который слушает действие, этот эффект вызывает 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)
     ))
   )
 );

Примечание: невозможно обновить бэкэнд.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Достаточно использовать 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)
     ))
   )
 );
0 голосов
/ 20 сентября 2019

Вы можете написать новую функцию 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()))
...