成功拨打服务NGRX后如何执行两种不同类型的操作

时间:2019-01-30 04:34:35

标签: angular rxjs ngrx rxjs6 ngrx-effects

所以我有商品搜索效果。基本上,我首先调度一个search_start动作,该动作具有用于该搜索的参数有效负载,然后效果生效,然后转到服务,然后返回响应,从而提供了产品列表。然后,我希望能够做两件事:

  1. 通过产品集合调度成功的行动
  2. 保存该搜索的参数,以供以后用于“ action.payload”中的“搜索历史”

我遇到第二个问题,主要是因为执行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 :(得分:2)

我认为您不需要显式定义返回类型。 否则,您可以使用mergeMap进行操作。我看到您将switchMapmergeMap颠倒了,您只需要颠倒位置,就可以了。

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())),
                ),
            ),
          );

答案 1 :(得分:0)

我已经看到并亲自采用的常见做法是为您的动作加上别名,即type SearchAction = SearchStart | SearchSave | SearchSuccess | SearchFail',然后效果的返回类型为Observable<SearchAction>。然后TypeScript将验证别名是否覆盖了所有返回的动作。