@ngrx/effects API 请求处理
@ngrx/effects API request handling
我曾遇到过一次登录尝试失败后我的登录表单停止工作的情况,为了发出请求我一直在使用 effect,这就是它在更改之前的样子:
@Effect()
login$ = this.actions$.ofType<authActions.Login>(
authActions.LOGIN,
).switchMap(
({ payload: data }) => this.client.login(data),
).map(
({ token }) => new authActions.LoginSuccess(token),
).catch(
(error) => of(new authActions.LoginFailure(error)),
);
具体而言 - 当用户在尝试失败后尝试登录时,Login
操作已正确发送到商店,但效果并未启动。
我拼命想修复那个错误,然后我做了一个我认为毫无意义的改变:
@Effect()
login$ = this.actions$.ofType<authActions.Login>(
authActions.LOGIN,
).switchMap(
({ payload: data }) => this.client.login(data).map(
({ token }) => new authActions.LoginSuccess(token),
).catch(
(error) => of(new authActions.LoginFailure(error)),
),
);
但幸运的是,(IMO) 毫无意义的更改修复了一切。登录尝试失败后,效果突然成功启动。有人可以向我解释发生了什么吗?
当 catch
(或者,在 RxJS 版本 6 中,catchError
)运算符捕获到错误时,组合的 observable 会继续 不同的 可观察到。
这意味着当发生错误时,您的效果将继续使用 catch
中返回的 of(new authActions.LoginFailure(error))
可观察对象。
继续该 observable 将看到 LoginFailure
动作被调度,但在那之后,observable 完成。这意味着效果完成,然后自动取消订阅其订阅者。因此效果停止调度进一步的动作。
这在 Paul Lessing 的文章 Handling Errors in NgRx Effects and there is a TSLint rule - rxjs-no-unsafe-catch
- to detect this particular problem in my rxjs-tslint-rules
包中有更详细的讨论。
我曾遇到过一次登录尝试失败后我的登录表单停止工作的情况,为了发出请求我一直在使用 effect,这就是它在更改之前的样子:
@Effect()
login$ = this.actions$.ofType<authActions.Login>(
authActions.LOGIN,
).switchMap(
({ payload: data }) => this.client.login(data),
).map(
({ token }) => new authActions.LoginSuccess(token),
).catch(
(error) => of(new authActions.LoginFailure(error)),
);
具体而言 - 当用户在尝试失败后尝试登录时,Login
操作已正确发送到商店,但效果并未启动。
我拼命想修复那个错误,然后我做了一个我认为毫无意义的改变:
@Effect()
login$ = this.actions$.ofType<authActions.Login>(
authActions.LOGIN,
).switchMap(
({ payload: data }) => this.client.login(data).map(
({ token }) => new authActions.LoginSuccess(token),
).catch(
(error) => of(new authActions.LoginFailure(error)),
),
);
但幸运的是,(IMO) 毫无意义的更改修复了一切。登录尝试失败后,效果突然成功启动。有人可以向我解释发生了什么吗?
当 catch
(或者,在 RxJS 版本 6 中,catchError
)运算符捕获到错误时,组合的 observable 会继续 不同的 可观察到。
这意味着当发生错误时,您的效果将继续使用 catch
中返回的 of(new authActions.LoginFailure(error))
可观察对象。
继续该 observable 将看到 LoginFailure
动作被调度,但在那之后,observable 完成。这意味着效果完成,然后自动取消订阅其订阅者。因此效果停止调度进一步的动作。
这在 Paul Lessing 的文章 Handling Errors in NgRx Effects and there is a TSLint rule - rxjs-no-unsafe-catch
- to detect this particular problem in my rxjs-tslint-rules
包中有更详细的讨论。