2016-01-28 26 views
24

Tôi đang làm việc trên ứng dụng Angular 2 và cần một số hướng dẫn về cách xử lý lỗi xác thực một cách rõ ràng.Góc 2 - Xử lý nhiều đăng ký trên một quan sát duy nhất

Mục tiêu cuối cùng của tôi là có thể quản lý tập trung các lỗi xác thực (cụ thể là 401 và 403) cho mỗi yêu cầu Http.

Tôi đã tìm thấy this câu hỏi cực kỳ hữu ích để bắt đầu, tuy nhiên, tôi bị mắc kẹt theo cách thích hợp để đăng ký trình xử lý lỗi của mình cho mỗi quan sát được thực hiện tùy chỉnh Http.

Dưới đây là một mẫu của những gì tôi đang làm việc với:

import {Injectable} from 'angular2/core'; 
    import {Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response} from 'angular2/http'; 

    import {Observable} from 'rxjs/Observable'; 


    @Injectable() 
    export class ClauthHttp extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
     super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     var response = super.get(url, options); 

     return this._handleSecurityResponse(response); 
    } 

    /* 
    Other overrides omitted for brevity... 
    */ 

    private _handleSecurityResponse(response: Observable<Response>):  Observable<Response> { 
     response.subscribe(null, (error: Response) => { 
      // Do some nifty error handling here. 
     }); 

     return response; 
    } 
} 

Các giải pháp trên "làm việc" với một xô ... Mỗi yêu cầu HTTP được thực hiện hai lần. Điêu đo không tôt.

Bất kỳ hướng dẫn nào về cách thực hiện đúng cách này?

(Cập nhật) Mã Working

Dựa trên thông tin trong câu trả lời chấp nhận đây là những gì lớp trông giống như trong hình thức hoạt động bình thường của nó.

import {Injectable} from 'angular2/core'; 
    import {Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response} from 'angular2/http'; 

    import {Observable} from 'rxjs/Observable'; 
    import 'rxjs/add/operator/share'; 


    @Injectable() 
    export class ClauthHttp extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
     super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     var response = super.get(url, options); 

     return this._handleSecurityResponse(response); 
    } 

    /* 
    Other overrides omitted for brevity... 
    */ 

    private _handleSecurityResponse(response: Observable<Response>):  Observable<Response> { 
     var sharable = response.share(); 

     sharable.subscribe(null, (error: Response) => { 
      // Do some nifty error handling here. 
     }); 

     return sharable; 
    } 
} 

Trả lời

29

Điều này có thể do thực tế là Observable<Response> của bạn có thể quan sát được, tức là nó được 'khởi động lại' cho mọi người đăng ký mới. Để có giải thích về các quan sát nóng và lạnh, hãy xem Hot and Cold observables : are there 'hot' and 'cold' operators?. Vì vậy, ở đây bạn có thể đăng ký một lần cho trình xử lý kết quả và một lần khác cho trình xử lý lỗi.

Bạn sẽ có thể để workaround tác đăng ký bên 'chia sẻ' quan sát của bạn,

tức là thay thế

var response = super.get(url, options); 

Với

var response = super.get(url, options).share();` 
+0

Thanks..this là chính xác những gì tôi đã được tìm kiếm – prash

Các vấn đề liên quan