在catchError里面的Ngrx mergeMap加入更多动作让我出错

时间:2017-12-25 10:18:29

标签: angular rxjs ngrx ngrx-effects

我想发出两个动作 在catchError块中 但我有这个错误

  

类型的参数'(错误:{})=>空隙'不能分配给参数   类型'(值:{},索引:数字)=> ObservableInput< {}>&#39 ;.类型   '空隙'不能分配给' ObservableInput< {}>'

import { Injectable, Inject } from '@angular/core';
import { Actions, Effect } from '@ngrx/effects';
import { Router } from '@angular/router';

import { catchError, map, mergeMap, switchMap } from 'rxjs/operators';
import { of } from 'rxjs/observable/of';

import {
  AuthenticationAccount
} from '../../models/account.model';

import * as fromActions from '../actions';

import { ACCOUNT_SERVICE } from '../../tokens';

@Injectable()
export class AccountEffects {
  @Effect()
  account$ = this.actions$.ofType(fromActions.ACCOUNT)
    .pipe(
    switchMap(() => {
      return this.accountService.account()
        .pipe(
        map((account: AuthenticationAccount) => {
          return { type: fromActions.ACCOUNT_SUCCESS, payload: account };
        }),
        catchError((error) => {
          this.router.navigateByUrl('/home');
          return mergeMap((error) => {
            [{ type: fromActions.ACCOUNT_FAIL, payload: error },
            { type: fromActions.LOGIN_RESET}]
          })
        })
        )
    })
    );
  constructor(
    private actions$: Actions,
    private router: Router,
    @Inject(ACCOUNT_SERVICE) private accountService
  ) { }
}

请帮帮我吗?

1 个答案:

答案 0 :(得分:3)

catchError部分错误,您使用mergeMap作为静态方法,但在pipe范围之外,这是不可能的。

按如下方式重做:

import { from } from 'rxjs/observable/from':

catchError((error) => {
          this.router.navigateByUrl('/home');
          const actions = [{ type: fromActions.ACCOUNT_FAIL, payload: error }, { type: fromActions.LOGIN_RESET}];
          return from(actions);
        })

顺便说一句:

  • 为什么要使用令牌注入服务?
  • 为什么不使用动作创作者?您可以使用类或方法来生成新对象,而不是创建新对象。