在抛出错误后保持可观察的流活动

时间:2017-03-14 18:33:55

标签: angular observable rxjs5

想知道如何在不终止流的情况下将错误从observable冒充到订阅者的错误函数

例如,进行http调用,当结果是404或任何其他错误时我捕获并在流中抛出错误。这会导致流终止并在订户

中输入错误功能块

但是,有没有办法捕获并保持流打开并将值传递给订阅者中的错误块。这是为了处理订户中的所述404错误而不是流。用于执行错误处理和基于错误的UI更改等操作。

更新代码: 我有这样的订阅者:

this.blahService.getSomething(id)
  .subscribe((response: Response) =>{

      this.cancelBtnText= 'Cancelled';
      this.canCancel = false;


    },
    err =>{
      console.log('ERRROR:::', err);
    });

和主题是这样的:

return this.http.get(this.config.apiEndpointUrl, this.options)
  .map((r: Response) => <blah>r.json())
  .catch((error: any) => {
    console.error('A friendly error occurred', error);
    return Observable.throw(error.message || error);
  });

对于http错误,这将导致调用catch函数。但是,当我抛出错误时,这会终止流及其所有订阅者,因此下次事件到来时调用服务我的订阅者不再收听它并且完全取消订阅,因此,没有信息被发送回订阅。

当我在服务中将throw更改为.empty()时,这会发生变化,因为这不会终止流,但现在不再调用订阅者中的error函数。

1 个答案:

答案 0 :(得分:0)

我添加了此代码以阐明订阅和错误处理实际上是如何工作的。

默认情况下,订阅(或管道)将保持完整等待(侦听)您的下一个http请求,即使出现错误。

如果您将订阅分配给变量,则可以取消订阅它。 这是NOT a recommended practice ......

此用例完全是假设,但显示了如何通过代码停止订阅。

默认RxJS Subject是另一种停止错误的方法..

  

主题不可重用:在RxJS中,主题无法重复使用。那是   要说,当主题完成或错误时,它就不能再使用了。   如果你试图接下来由于它完整或关闭的主题   调用错误方法,它会默默地忽略通知。   如果您希望主题在您旁边时大声而愤怒地出错   在它完成有用之后,你可以直接调用取消订阅   主题实例本身。

import { Subscription } from "rxjs/Subscription";
...
export myComponent implements ngOnInit {
  sub: Subscription;
  records : DomainClz[];


  constructor(private domainService:DomainService) {}

  onInit() {
     // assumes getRecords returns Observable<DomainClz[]>
     // ie it chains map((resp:Response )to resp.json()) to http.get()
     this.sub = this.domainService.getRecords().
       subscribe(records => { this.records = records) },
                 error =>   { console.error(error)    }
       );
  }

  cancel() {
    this.sub.unsubscribe()
  }
}