Как выполнить два разных типа действий после успешного вызова сервиса NGRX - PullRequest
0 голосов
/ 30 января 2019

Итак, у меня есть эффект поиска товара.По сути, я сначала отправляю действие search_start, у которого есть полезная нагрузка параметров для этого поиска. Затем происходит переход к услуге, и я получаю ответ, который дает мне список продуктов.Затем я хочу сделать две вещи:

  1. Отправить успешное действие с набором продуктов
  2. Сохранить параметры для этого поиска, чтобы позже использовать их для «истории поиска».который в настоящее время находится в 'action.payload'

У меня проблема 2-й части, в основном потому, что выполнение switchMap и наличие returnType 'SearchResultResponseType' означает, что я не могу теперь сделать SearchSave(action.payload) главным образом потому, что полезная нагрузка имеет тип 'SearchParameterType'.Таким образом, я могу только выполнить свое действие SearchSuccess.

Есть ли в любом случае это может быть выполнено?Я попытался изменить тип ответа на супертип, который принимает SearchParameterType и SearchResultResponseType как два свойства этого типа, и вместо этого мой productSearchService возвращает это значение, но, похоже, также приводит к ошибкам.Есть ли более простой способ?

       export class ProductSearchEffects {
          @Effect() startSearch$: Observable<
            ActionWithPayload<SearchResultResponseType> | Observable<Action>
          > = this.actions$.pipe(
            ofType<SearchStart>(ProductSearchActions.SEARCH_START),
            mergeMap(action =>
              this.productSearchService.fetchSearchResults(action.payload)
                .pipe(
// if successful then save search and dispatch search success
                switchMap((data: SearchResultResponseType) => [
                    new SearchSave(action.payload),
                    new SearchSuccess(data),
                  ]),

                  catchError(() => of(new SearchFail())),
                ),
            ),
          );

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Обычная практика, которую я видел и лично применил, состоит в том, чтобы псевдоним ваших действий, т.е. type SearchAction = SearchStart | SearchSave | SearchSuccess | SearchFail', а затем тип возвращаемого эффекта - Observable<SearchAction>.Затем TypeScript проверит, что все возвращаемые действия покрыты псевдонимом.

0 голосов
/ 30 января 2019

Я не думаю, что вам нужно явно определять тип возвращаемого значения.В противном случае вы можете сделать это с mergeMap.Я вижу, вы положили свои switchMap и mergeMap в обратном направлении, вам просто нужно поменять позицию, и вы должны хорошо идти.

export class ProductSearchEffects {
          @Effect() startSearch$ = this.actions$.pipe(
            ofType<SearchStart>(ProductSearchActions.SEARCH_START),
            switchMap(action =>
              this.productSearchService.fetchSearchResults(action.payload)
                .pipe(
                  mergeMap((data: SearchResultResponseType) => [
                    new SearchSave(action.payload),
                    new SearchSuccess(data),
                  ]),
                  catchError(() => of(new SearchFail())),
                ),
            ),
          );
...