【问题标题】:angular2 - observable not streaming?angular2 - 可观察到的不是流式传输?
【发布时间】:2017-07-17 19:10:20
【问题描述】:

我已经设置了这样一个可观察的模式并且它通常可以工作,但是当我在自定义错误处理程序中使用它时它不起作用。

显然构造函数中的代码永远不会执行,但它是一个常规类,我不能使用 onInit ,不是吗?

编辑:我尝试将代码放在一个 init 函数中,该函数在订阅之前从对话框组件调用,但是当发生错误时,handleError 被调用,似乎上下文已经改变并且没有定义任何东西(观察者和可观察者是未定义)

自定义错误处理程序:

export class CustomErrorHandler implements ErrorHandler 
{
   public errors : Observable<Error>;
   private errorsObserver : Observer<Error>;

   constructor() {

       this.errors = Observable.create((observer :Observer<Error>)=>  <<<<<<THIS ONE NEVER GETS EXECUTED
        {
          this.errorsObserver = observer;
       }).share();
   }

  handleError(error:Error) {
    this.errorsObserver.next(error);
  }
}

@NgModule({
  providers: [{provide: ErrorHandler, useClass: CustomErrorHandler}]
})
export class CustomErrorHandlerModule {}

对话框组件:

@Component({
    moduleId: module.id,
    selector: 'dialog',
    templateUrl: './dialog.component.html',
})
export class Dialog implements OnInit
{
    private ErrorMsg: string;
    public ErrorMessageIsVisible: boolean;

    errorsSub:Subscription ;

    constructor(private customErrorHandler: CustomErrorHandler) {
    }

    ngOnInit()
    {
        this.errorsSub = this.customErrorHandler.errors.subscribe(
          (error) => {
                         this.showErrorMessage(error.message);   
                     });
    }

    showErrorMessage(msg: string)
    {
        this.ErrorMsg = msg;
        this.ErrorMessageIsVisible = true;
    }

    hideErrorMsg()
    {
        this.ErrorMessageIsVisible = false;
    }
}

【问题讨论】:

    标签: angular observable


    【解决方案1】:

    我认为问题在于您使用的不是同一个 CustomErrorProvider 实例。

    您的提供者是 ErrorHandler:

    @NgModule({
      providers: [{provide: ErrorHandler, useClass: CustomErrorHandler}]
    })
    

    在您的 Dialog 中,您必须注入 ErrorHandler 并强制转换为 CustomErrorHandler:

    constructor(errorHandler: ErrorHandler) {
         this.customErrorHandler = errorHandler as CustomErrorHandler;
         ...
    }
    

    【讨论】:

    • 它可以工作(可观察的触发器)但我的对话框没有显示...在其他情况下对话框可以工作,所以当抛出异常时,流程会以某种方式中断,或者可能是因为服务中发生错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2016-10-29
    相关资源
    最近更新 更多