2016-03-28 197 views

回答

3

你可以實現一個擴展了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);   
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 

     console.log('get...'); 

     return super.get(url, options); 
    } 
} 

引導您的應用程序時註冊它:

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

這樣,您就能夠攔截所有請求在Angular2中。

在此級別,您可以檢查令牌到期日期並執行刷新令牌請求。 flatMap操作符將幫助您在此等待執行刷新令牌請求以執行傳輸請求。

看到這個代碼示例:

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
    return me.authService 
      .refreshAuthenticationObservable() 
      //Use flatMap instead of map 
      .flatMap((authenticationResult:AuthenticationResult) => { 
        if (authenticationResult.IsAuthenticated == true) { 
        // retry with new token 
        me.authService.setAuthorizationHeader(request.headers); 
        return super.request(url, request); 
        } 
        return Observable.throw(initialError); 
    }); 
} 

詳情請參見這個問題:

+0

嗨,蒂埃裏,代碼----返回me.authService ----這個會在哪裏,爲什麼這需要一個自定義的http實現? – shiv

+0

嘿嘿。我們需要一個自定義的http類來透明地截取所有請求,而無需更新現有的代碼(http調用)。你是對的「返回me.authService ...」。我更新了答案。 –

0
Observable.forkJoin(
    this.http.get('/app/1').map((res:Response) => res.json()), 
    this.http.get('/app/2').map((res:Response) => res.json()) 
).subscribe(
    data => { 
    this.a = data[0] 
    this.b = data[1] 
    refreshToken(); 
    }, 
    err => console.error(err) 
);