Angular @ngrx/effects API请求处理

Angular @ngrx/effects API请求处理,angular,redux,rxjs,ngrx,reactivex,Angular,Redux,Rxjs,Ngrx,Reactivex,我有一个案例,我的登录表单在一次登录尝试失败后停止工作,因为我一直在使用effect发出请求,这就是更改之前的情况: @Effect() login$=类型的this.actions$( authoctions.LOGIN, ).开关图( ({payload:data})=>this.client.login(数据), ).地图( ({token})=>新建authActions.LoginSAccess(token), ).接住( (错误)=>of(新建authActions.LoginFai

我有一个案例,我的登录表单在一次登录尝试失败后停止工作,因为我一直在使用effect发出请求,这就是更改之前的情况:

@Effect()
login$=类型的this.actions$(
authoctions.LOGIN,
).开关图(
({payload:data})=>this.client.login(数据),
).地图(
({token})=>新建authActions.LoginSAccess(token),
).接住(
(错误)=>of(新建authActions.LoginFailure(错误)),
);
具体来说-当用户尝试在失败尝试后登录时,
login
操作已正确发送到商店,但效果未启动

我拼命想修复这个bug,然后我做了一个我认为毫无意义的改变:

@Effect()
login$=类型的this.actions$(
authoctions.LOGIN,
).开关图(
({payload:data})=>this.client.login(data.map)(
({token})=>新建authActions.LoginSAccess(token),
).接住(
(错误)=>of(新建authActions.LoginFailure(错误)),
),
);

但幸运的是,毫无意义的改变修复了一切。登录尝试失败后,效果突然成功启动。有人能解释一下发生了什么吗?

当一个错误被
catch
(或者,在RxJS版本6中,
catchError
)操作符捕获时,合成的可观察对象继续使用一个不同的可观察对象

这意味着,当发生错误时,您的效果将继续在
catch
中返回的
的(new authoctions.LoginFailure(error))
可观察到

继续使用该可观察对象将看到
LoginFailure
操作被调度,但在此之后,可观察对象完成。这意味着效果完成,其订户将自动取消订阅。因此,效果停止了进一步的行动


保罗·莱辛(Paul Lessing)的文章对此进行了更详细的讨论,并且有一个TSLint规则——用于检测我的软件包中的特定问题。

谢谢@cartant,你能发布一个我可以接受的答案吗?当然。我可以稍后在移动ATM上写一个。