我有一个关于@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();
});
Run Code Online (Sandbox Code Playgroud)
第一次调度LOGIN会按预期方式抛出并捕获错误.但是,如果我之后第二次发送LOGIN,则没有任何反应; 效果未执行.
因此我尝试了以下方法:
.catch(err => {
return this.login$;
});
Run Code Online (Sandbox Code Playgroud)
,但这导致无限循环......你知道如何在不阻止事后执行效果的情况下捕获错误吗?
我有以下代码:
app.module.ts:
NgModule({
declarations: [
AppComponent
],
imports: [
RouterModule,
BrowserModule,
ReactiveFormsModule,
FormsModule,
HttpModule,
AppRoutingModule // Routes
],
providers: [ // services
AppLog,
{provide: ErrorHandler, useClass: MyErrorHandler}
],
bootstrap: [AppComponent]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
MyErrorHandler.ts:
@Injectable()
export class MyErrorHandler implements ErrorHandler {
constructor (private _appLog: AppLog) {}
handleError(error:any):void {
let errorMessage: string = "" + error
this._appLog.logMessageAsJson(errorMessage, "error")
.subscribe(
...
)
}
}
Run Code Online (Sandbox Code Playgroud)
appLog.ts
@Injectable()
export class AppLog {
constructor (private _http: Http) {}
logMessageAsJson(message: string, type: string) { …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习@ ngrx/store和@ ngrx.effects,并在我的Angular/Ionic应用程序中创建了我的第一个效果.它第一次运行正常但如果我再次将事件发送到商店(即再次单击按钮),则没有任何反应(没有进行网络调用,控制台日志中没有任何内容).有什么明显的东西我做错了吗?这是效果:
@Effect() event_response$ = this.action$
.ofType(SEND_EVENT_RESPONSE_ACTION)
.map(toPayload)
.switchMap((payload) => this.myService.eventResponse(payload.eventId,payload.response))
.map(data => new SentEventResponseAction(data))
.catch((error) => Observable.of(new ErrorOccurredAction(error)));
Run Code Online (Sandbox Code Playgroud)
谢谢