Как отправлять несколько действий из эффектов ngrx 7

#angular #typescript #ngrx #ngrx-effects

#angular #typescript #ngrx #ngrx-эффекты

Вопрос:

Идея состоит в том, чтобы прослушать одно действие, чтобы вызвать этот эффект, а затем выполнить вызов службы, который возвращает данные. Когда вызов службы будет успешным, я хочу отправить два разных действия. Я перепробовал много разных комбинаций, которые я нашел на SO, но ни одна из них не работает — отправка выполняется только для первого действия, полностью игнорируя второе. Пробовал это с switchMap , mergeMap но по-прежнему отправляется только первое действие.

 @Effect()
    getAllShows$ = this.actions$
    .pipe(
        ofType(GetAllShowsAction.GET_ALL_SHOWS),
        switchMap((action: any) => this.showService.getAllShows(action.payload).pipe(
            mergeMap( response => { return [new GetAllShowsAction(action.payload   1), new GetAllShowsSuccessAction(response)] },
            catchError( error => of(new GetAllShowsErrorAction()))
            )
        )
));
  

Информация о моем приложении:

 Angular CLI: 7.3.6
Node: 10.10.0
OS: darwin x64
Angular: 7.2.10
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.13.6
@angular-devkit/build-angular     0.13.6
@angular-devkit/build-optimizer   0.13.6
@angular-devkit/build-webpack     0.13.6
@angular-devkit/core              7.3.6
@angular-devkit/schematics        7.3.6
@angular/cli                      7.3.6
@angular/fire                     5.1.2
@ngtools/webpack                  7.3.6
@schematics/angular               7.3.6
@schematics/update                0.13.6
rxjs                              6.4.0
typescript                        3.2.4
webpack                           4.29.0
  

Версия NgRx 7.3.0.

Ответ №1:

Попробуйте это:

 @Effect()
    getAllShows$ = this.actions$
    .pipe(
        ofType(GetAllShowsAction.GET_ALL_SHOWS),
        switchMap((action: any) => this.showService.getAllShows(action.payload)),
        switchMap(res => [
            new GetAllShowsAction(action.payload   1),
            new GetAllShowsSuccessAction(response)
        ]),
        catchError( error => of(new GetAllShowsErrorAction()))
);
  

Комментарии:

1. Это не удается скомпилировать, потому что первая switchMap принимает до 2 аргументов, но были предоставлены 3 (service, switchMap и catchError). Вот почему мне пришлось передать этот вызов службы в первую очередь. Имеет ли это смысл?

2. Извините, я пропустил закрывающее «)»

3. Вы правы! Но также мне пришлось ссылаться action в качестве параметра из восходящего потока во второй switchMap, поскольку мне нужно было получить доступ к его полезной нагрузке там. Спасибо за вашу помощь!

4. Конечно (: Рад, что смог