当前位置:  开发笔记 > 编程语言 > 正文

ngrx影响错误处理

如何解决《ngrx影响错误处理》经验,为你挑选了1个好方法。

我有一个关于@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$;
    });

,但这导致无限循环......你知道如何在不阻止事后执行效果的情况下捕获错误吗?



1> cartant..:

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组成进入内可观察到的将看到一个空观察到的扁平/合并到的效果,所以不动作将被发射.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有