【问题标题】:How to call twice a service that is called in a ngrx effect?如何调用两次在ngrx效果中调用的服务?
【发布时间】: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)
     ))
   )
 );

注意:无法更新后端。

【问题讨论】:

  • 这个问题有什么更新吗?

标签: angular typescript redux rxjs ngrx


【解决方案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()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2017-07-08
      • 2019-02-12
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多