Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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 http错误时如何停止订阅_Angular_Typescript - Fatal编程技术网

Angular http错误时如何停止订阅

Angular http错误时如何停止订阅,angular,typescript,Angular,Typescript,我正在寻找一种方法,当拦截器抛出HttpError时,如何停止在任何方法中进行subscripting。在我的Angular应用程序中,很少有组件使用如下方式从后端下载数据: getItems(){ this.isProcessing = true; this.itemsService.getItems().subscribe((x) => { this.itemList = x; this.isProcessing = false; }); } 当数据请求开始时,isProce

我正在寻找一种方法,当拦截器抛出HttpError时,如何停止在任何方法中进行subscripting。在我的Angular应用程序中,很少有组件使用如下方式从后端下载数据:

    getItems(){
this.isProcessing = true;
this.itemsService.getItems().subscribe((x) => {
this.itemList = x;
this.isProcessing = false;
});
}
当数据请求开始时,isProcessing设置为true,spinner开始循环。收到数据后,它停止。每一个http请求都要经过HttpInterceptor,HttpInterceptor向请求添加令牌,并且在任何http eror的情况下都有错误处理程序。 当用户没有下载某些数据的权限时,错误403来自后端。我试图做的是用一些信息显示模态,停止在任何发出该请求的组件中订阅方法,并将IsSpining设置为false,就像什么都没有发生一样。
我是否应该在拦截器中创建一些可观察的对象,并在每个方法中使用它来判断是否停止订阅?

您可以使用
error
回调
subscribe()
方法,如下所示:

getItems(){
  this.isProcessing = true;
  this.itemsService.getItems().subscribe(
    (x) => {
      this.itemList = x;
      this.isProcessing = false;
    },
    (error) => {
      // Create your modal here
      this.isProcessing = false;
    }
  );
}
参考:

试试这个

getItems(){
    this.isProcessing = true;
    this.itemsService.getItems().subscribe((x) => {
    if(x !=null || x != undefined) {
      this.itemList = x;
       this.isProcessing = false;
    } 
  else {
    this.isProcessing = false;
  }
  });

您需要使用错误回调,但只有在侦听器中未捕获错误时,才起作用

getItems(){
  this.isProcessing = true;
  this.itemsService.getItems().subscribe(
    (x) => {
      this.itemList = x;
      this.isProcessing = false;
    },
    (error) => { this.isProcessing = false; }
   }
  );
}

因此,您要么捕获拦截器中的错误(用于日志记录或任何其他逻辑)并将其抛出,要么根本不捕获它。

但如果我将从拦截器中删除403处理程序并将其粘贴到每个方法中,它不会被重复太多次吗?将处理程序放入拦截器的主要目的是只编写一次,然后在整个应用程序中使用。您必须决定使用拦截器处理后端错误的集中方法(也可以全局处理微调器)。或者,在每个组件中处理该问题。我推荐第一种方法。或者,在403401的情况下,您可以在拦截器中全局显示一些错误消息或重定向到某个路由(/login或/unauthorized…等)。在另一种情况下,将错误返回到组件来处理它。“只有在您没有在拦截器中捕获错误时才有效”并不完全正确。您可以捕获错误并使用RxJS的
throwError
返回一个可观察到的错误。这里有一个有效的例子:这就是我在回答结束时解释的:如果你只是想停止订阅方法,只需在组件中添加ngdestory方法,然后取消订阅