在没有完成流的情况下,有没有办法在ngrx-effects流中使用带有Error对象的UIImagePickerController
?
我已经阅读了这些关于为什么通过抛出错误来杀死流的好答案:
@ngrx Effect does not run the second time
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
这意味着我只是抛出错误,它们是根据类型
处理的答案 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
电话,我认为测试也会更清晰,更容易。