【问题标题】:Angular 2 - How to get Observable.throw globallyAngular 2 - 如何全局获取 Observable.throw
【发布时间】:2016-02-16 17:52:10
【问题描述】:

如何,我想全局处理 http 错误(特别是状态 401)。我知道我可以做这样的事情

getCompanies() {
    return this.http.get('https://angular2.apispark.net/v1/companies/')
       .map(res => res.json())
       .catch(res => {
           return Observable.throw(res.json());
       });

如何在另一个组件上出现此错误?

只是为了解释我想实现所有 401 错误将用户重定向到登录页面

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    一种方法可能是扩展 HTTP 对象以拦截错误:

    @Injectable()
    export class CustomHttp extends Http {
      constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
        super(backend, defaultOptions);
      }
    
      request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
        console.log('request...');
        return super.request(url, options).catch(res => {
          // do something
        });        
      }
    
      get(url: string, options?: RequestOptionsArgs): Observable<Response> {
        console.log('get...');
        return super.get(url, options).catch(res => {
          // do something
        });
      }
    }
    

    并按如下所述进行注册:

    bootstrap(AppComponent, [HTTP_PROVIDERS,
        new Provider(Http, {
          useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
          deps: [XHRBackend, RequestOptions]
      })
    ]);
    

    如果在此级别发生 401 错误,您可以根据您在此 CustomHttp 类上注入的当前路由器将用户重定向到登录页面。

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2017-06-08
      • 2017-08-27
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多