我有一个关于@ngrx效果的非常基本的问题:如何忽略在执行效果期间发生的错误,使其不影响将来的效果执行?
我的情况如下:我有一个动作(LOGIN)和一个听取该动作的效果.如果在此效果中发生错误,我想忽略它.在此错误后第二次调度LOGIN时,应该再次执行该效果.
我的第一次尝试是:
@Effect() login$ = this.actions$ .ofType('LOGIN') .flatMap(async () => { console.debug('LOGIN'); // throw an error let x = [];x[0](); }) .catch(err => { console.error('Error at login', err); return Observable.empty(); });
第一次调度LOGIN会按预期方式抛出并捕获错误.但是,如果我之后第二次发送LOGIN,则没有任何反应; 效果未执行.
因此我尝试了以下方法:
.catch(err => { return this.login$; });
,但这导致无限循环......你知道如何在不阻止事后执行效果的情况下捕获错误吗?
该ngrx
基础设施赞成通过导入到应用程序的提供者的作用NgModule
使用EffectsModule.run
.
当可观察到的错误并catch
返回一个空的obervable时,组合的observable完成并且其订阅者被取消订阅 - 这是Observable Contract的一部分.这就是你认为没有进一步处理LOGIN
你的行动的原因.该效果在完成时取消订阅,ngrx
基础设施不会重新订阅.
通常,您将在flatMap
(现在调用mergeMap
)内部进行错误处理:
import { Actions, Effect, toPayload } from "@ngrx/effects";
@Effect()
login$ = this.actions$
.ofType('LOGIN')
.map(toPayload)
.flatMap(payload => Observable
.from(Promise.reject('Boom!'))
.catch(error => {
console.error('Error at login', error);
return Observable.empty();
})
});
的catch
组成进入内可观察到的将看到一个空观察到的扁平/合并到的效果,所以不动作将被发射.