2016-11-23 50 views
0

我正在尝试为AuthHttp服务(angular2-jwt)创建一个'拦截器'。我创建了一个扩展AuthHttp并使用它的类。到目前为止,它似乎工作正常。我现在想要做的是,如果服务器响应401代码就是强制在我的应用程序中注销并忽略以下订阅(我不确定这些订阅是否按顺序执行,所以我不知道我是否在'米问会是可能的)。在Angular 2中取消可观察订阅序列

由于我只是想在这种情况下显示错误,我只需要从此订阅中止队列并忽略进一步的订阅。这里是我得到的代码到目前为止的get方法:

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    let observable = super.get(url, options); 
    observable.subscribe(
     () => { }, 
     (error: Response) => { 
      if (error.status === 401) { 
       // Logout and ignore all other subscriptions 
      } 
     } 
    ); 

    return observable; 
} 

这可能吗?

谢谢!

回答

1

您可以unsubscribesubscribe方法返回一个Subscription对象。您可以使用它来取消订阅:

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    let observable = super.get(url, options); 
    let subscription = observable.subscribe(
     () => { }, 
     (error: Response) => { 
      if (error.status === 401) { 
       // Logout and ignore all other subscriptions 
       subscription.unsubscribe(); 
      } 
     } 
    ); 

    return observable; 
} 
+0

感谢您的答案,但我不明白我会用这个完成。作为一个测试,我粘贴了你的代码,并把'取消订阅'放在console.log中。在另一个订阅中(在使用.get()调用rest api并订阅observable的服务中),我用另一个字符串写了另一个console.log。这两个都打印到控制台。我想避免的是这个可观察对象的其他错误处理程序无法执行。 –

+0

然后我不确定我是否理解你的问题。你可以试着解释一下这个问题好一点吗? – yarons

+0

我已经设置了一个需要登录REST API的APP。在登录时,应用程序会发出一个它存储并用来验证所有安全的API调用(使用AuthHttp)的jwt令牌。当检索数据时,我使用一个帖子或获取电话并订阅检索它或显示错误(无法连接或这样)。如果服务器不能验证一个调用,它将返回一个401.我想要的是附加一个函数(作为拦截器)来检查每个经过验证的调用,并且如果服务器返回401强制注销并跳过所有其他错误,则可能会检查它如果可能的话已经订阅。 –