Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 抛出错误后保持可观察流活动_Angular_Observable_Rxjs5 - Fatal编程技术网

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

Angular 抛出错误后保持可观察流活动,angular,observable,rxjs5,Angular,Observable,Rxjs5,想知道如何在不终止流的情况下,将可观察到的错误冒泡到订阅者的err函数 例如,进行http调用,当结果是404或任何其他错误时,我捕获并在流中抛出错误。这将导致流终止,并在订阅服务器中输入err功能块 然而,有没有一种方法可以捕获并保持流打开,并将值传递给订阅服务器中的错误块。这是为了处理订户中而不是流中的404错误。用于执行错误处理和基于错误的UI更改等操作 更新代码: 我有一个这样的订户: this.blahService.getSomething(id) .subscribe((res

想知道如何在不终止流的情况下,将可观察到的错误冒泡到订阅者的err函数

例如,进行http调用,当结果是404或任何其他错误时,我捕获并在流中抛出错误。这将导致流终止,并在订阅服务器中输入err功能块

然而,有没有一种方法可以捕获并保持流打开,并将值传递给订阅服务器中的错误块。这是为了处理订户中而不是流中的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);
  });
返回this.http.get(this.config.apidemportURL,this.options)
.map((r:Response)=>r.json()
.catch((错误:任意)=>{
console.error('发生友好错误',错误);
返回可观察的.throw(error.message | | error);
});
对于http错误,这将导致调用
catch
函数。然而,当我抛出错误时,这将终止流及其所有订阅者,因此下次调用服务时,我的订阅者将不再侦听它,并且完全取消订阅,因此,不会将任何信息发送回订阅


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

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

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

如果将订阅分配给变量,则可以取消订阅。。 是

这个用例完全是假设的,但展示了如何通过代码停止订阅

默认设置是另一种出错时停止的方式

主题不可重用:在RxJS中,主题不能重用。就是 也就是说,当一个主题完成或出现错误时,它就不能再使用了。 如果您尝试下一个主题,但该主题因其完整或不完整而关闭 调用错误方法时,它将以静默方式忽略通知。 如果你想让被摄对象在你旁边时大声而愤怒地出错 当它有用后,你可以直接在 主体实例本身

从“rxjs/Subscription”导入{Subscription};
...
导出myComponent实现ngOnInit{
分:认购;
记录:域名CLZ[];
构造函数(私有域服务:域服务){}
onInit(){
//假设getRecords返回的结果是可观察的
//ie it链映射((resp:Response)到resp.json())到http.get()
this.sub=this.domainService.getRecords()。
订阅(记录=>{this.records=records)},
错误=>{console.error(error)}
);
}
取消{
此.sub.取消订阅()
}
}

我添加此代码是为了阐明订阅和错误处理的实际工作原理

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

如果将订阅分配给变量,则可以取消订阅。。 是

这个用例完全是假设的,但展示了如何通过代码停止订阅

默认设置是另一种出错时停止的方式

主题不可重用:在RxJS中,主题不能重用。就是 也就是说,当一个主题完成或出现错误时,它就不能再使用了。 如果您尝试下一个主题,但该主题因其完整或不完整而关闭 调用错误方法时,它将以静默方式忽略通知。 如果你想让被摄对象在你旁边时大声而愤怒地出错 当它有用后,你可以直接在 主体实例本身

从“rxjs/Subscription”导入{Subscription};
...
导出myComponent实现ngOnInit{
分:认购;
记录:域名CLZ[];
构造函数(私有域服务:域服务){}
onInit(){
//假设getRecords返回的结果是可观察的
//ie it链映射((resp:Response)到resp.json())到http.get()
this.sub=this.domainService.getRecords()。
订阅(记录=>{this.records=records)},
错误=>{console.error(error)}
);
}
取消{
此.sub.取消订阅()
}
}

A
http.get
是一个一次性流,它将
在一次发射后完成
——您可能错过了一些代码吗?如果您不希望流结束,为什么要返回
Observable.throw()
?这与没有一个
catch()
非常相似。也许这个答案对你有帮助:?我想我对这一切的想法都错了。我有一个订阅者在安装类时正在收听。由于该订阅服务器是类的唯一订阅服务器,因此当发出错误时,它将取消流及其所有订阅服务器。因此,由于订阅者不再订阅,所有后续的服务调用都无法完成。
http.get
是一个一次性流,在一次发射后将
complete
——您可能错过了一些代码吗?如果您不希望流结束,为什么返回
Observable.throw()
?这与没有一个
catch()
非常相似。也许这个答案对你有帮助:?我想我对这一切的想法都错了。我有一个订阅者在安装类时正在收听。由于该订阅服务器是类的唯一订阅服务器,因此当发出错误时,它将取消流及其所有订阅服务器。因此,由于订户不再订阅,所有后续的服务调用都无法完成。
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()
  }
}