是否可以在不完成Observable流的情况下在ngrx-effects中抛出错误?

时间:2017-12-19 22:32:49

标签: angular error-handling ngrx ngrx-effects

在没有完成流的情况下,有没有办法在ngrx-effects流中使用带有Error对象的UIImagePickerController

我已经阅读了这些关于为什么通过抛出错误来杀死流的好答案:

@ngrx Effect does not run the second time

ngrx effects error handling

https://github.com/ngrx/platform/issues/646

我的问题是,如果我能够使用角色throw来捕捉错误,我是否可以将其与ngrx效果一起使用。

ErrorHandler

我想我可以创造一些方法来处理并不涉及投掷任何事情的错误,但是想确保我需要走这条路线,或者是否有办法让两者和平共存。< / p>

目前在我的班级中实现@Effect() loginUserEffect: Observable<loginActions.Actions> = this.actions$ .ofType(loginActions.LOGIN_USER) .map((action: loginActions.LoginUser) => action.payload) .mergeMap(payload => { return this.loginService .authenticate(payload) .map(response => new loginActions.LoginUserSuccess(response)) .catch((error: HttpErrorResponse) => of(new loginActions.LoginUserFailure(error)) ) }) @Effect({ dispatch: false }) loginUserEffectSuccess$ = this.actions$ .ofType(loginActions.LOGIN_USER_SUCCESS) .do(() => this.router.navigate(['/account-home'])) @Effect({ dispatch: false }) loginUserEffectFailure$ = this.actions$ .ofType(loginActions.LOGIN_USER_FAILURE) .map((action: loginActions.LoginUserFailure) => { throw action.payload // Stream completes }) ,我有这个:

ErrorHander

这意味着我只是抛出错误,它们是根据类型

处理的

2 个答案:

答案 0 :(得分:3)

我最终创建了一个错误操作:

@Effect()
  loginUserEffectFailure$: Observable<
    errorsActions.Actions
  > = this.actions$
    .ofType(loginActions.LOGIN_USER_FAILURE)
    .map(
      (action: loginActions.LoginUserFailure) =>
        new errorsActions.Error(action.payload)
    )

并以专用效果调用错误处理程序:

@Effect({ dispatch: false })
  errorEffect$ = this.actions$
    .ofType(errorsActions.ERROR)
    .map((action: errorsActions.Error) =>
      this.clientErrorHandler.handleError(action.payload)
    )

我离开全局错误处理程序只是为了捕获和记录意外的异常。

答案 1 :(得分:1)

如果要抛出一个不会被observable捕获的错误,而是将其报告给全局错误处理程序,则会从observable的调用堆栈外部抛出错误。

你可以这样做:

@Effect({ dispatch: false })
loginUserEffectFailure$ = this.actions$
  .ofType(loginActions.LOGIN_USER_FAILURE)
  .do(action => setTimeout(() => { throw action.payload; }, 0))
})

但是,由于您的效果属于已经使用Angular的DI机制的类,我建议您注入GlobalErrorHandler并直接调用它。

如果没有setTimeout电话,我认为测试也会更清晰,更容易。