【问题标题】:RXJS Catch operator not catch the ErrorRXJS Catch 运算符未捕获错误
【发布时间】:2017-09-08 18:06:34
【问题描述】:

当我尝试在我的 Angular4 项目中设置 redux 时遇到问题,我使用以下代码来管理登录操作:

@Effect()
  login$: Observable<Action> = this.act
    .ofType(actions.LOGIN)
    .map((action: actions.LoginAction) => action.payload)
    .switchMap((val: { email: string, password: string }) => this.authService.login(val.email, val.password)
      .map(auth => new actions.LoginSuccessAction(auth))
      .catch(err =>  of(new actions.LoginFailAction(err))));

由于某种原因,Webstorm 无法识别 rxjs 的“map”运算符,但它在编译时运行良好。

在 authService 中,我定义了模拟登录检查:

login(email: string, password: string): Observable<any> {
    if (email == 'a@gmail.com') {
      return Observable.of('Login Success');
    }
     throw(new Error('Username or password incorrect'));
  }

如果电子邮件是 a@gmail.com 一切正常,redux 状态会发生变化,但是如果登录失败,我的“catch”操作员由于某种原因没有捕捉到错误,而是在控制台中显示错误如下@987654322 @

在我的核心模块文件夹中,我将模块导入如下:

import 'rxjs/add/operator/catch';

有人知道这里发生了什么吗?

谢谢

【问题讨论】:

  • 不要抛出 new Error 试试 throw false 或任何适合的值。这应该被 catch 操作符捕获。
  • @David Throwing false 不会有任何区别。实际问题在下面的答案中描述。

标签: angular redux rxjs webstorm ngrx


【解决方案1】:

问题是login 方法中的错误被抛出到你的效果中组成的可观察链之外。

也就是说,错误被抛出,而不是返回一个 observable - mapcatch 运算符将被链接到该 observable。所以catch是抓不到的。

相反,您可以返回使用 Observable.throw 创建的 observable:

import 'rxjs/add/observable/throw';

login(email: string, password: string): Observable<any> {
  if (email == 'a@gmail.com') {
    return Observable.of('Login Success');
  }
  return Observable.throw(new Error('Username or password incorrect'));
}

这样做会返回一个 observable,它会在订阅时引发错误通知。您的catch 将捕获该错误。

【讨论】:

  • 是的,我认为你是对的,我发现解决问题的方法是使用 return ErrorObservable.create(Error('用户名或密码不正确'))。然后错误就成功捕获了~谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 2016-05-21
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多