2017-06-20 141 views
1

我正試圖在Angular4中實現一個請求/響應攔截機制。我對observables相當陌生。Angular 4中的HTTP請求重試機制?

我維護兩個攔截器數組,一個用於請求,另一個用於響應。攔截器只是接受請求/響應對象並轉換它們的函數。

sendRequest(req:Response):Observable<Response>{ 
    req= this.processRequest(req); 

    This.http.request(req) 
      .map((res:Response)=>{ 
       return this.processResponse(res) 
      }) 
      .catch(this.handleError) 
} 

handleError(err:Response):Observable<Response>{ 
    return Observable.throw(err); 
} 

基本錯誤處理工作正常。有時候對於401異常,我想獲得新的Auth令牌,並用更新後的Auth令牌重試相同的請求。

我在想什麼是引入錯誤攔截器的數組。其中一個錯誤攔截器函數將檢查它是否爲401,並向服務器發出一個新的刷新請求,使後續的錯誤攔截器函數失效。我認爲有必要切換可觀察的流。觀察者最終將得到最新請求的迴應。如何繼續?

+0

試試這個:https://stackoverflow.com/questions/36652495/angular2-http-retry-logic – SrAxi

+0

可能重複的[Angular2 http重試邏輯](https://stackoverflow.com/questions/36652495/angular2- http-retry-logic) – Pace

+0

@Pace我的疑問是關於從一個攔截器函數內切換流。如果我與http.request的級別相同,Switchmap可以工作。 – NewtonCode

回答

2

試試這個:

this.http.get('some/url').retry(2)......

+2

解釋一下會有幫助.. – Blackbam

0

它似乎更容易我在同一水平http.request做到這一點,否則你將需要保持的所有信息軌道重新發出請求,但也許這是在這種情況下沒有麻煩...

我猜你的攔截器正在對請求對象本身進行操作並返回請求對象的副本?例如,像...

transformResponse(response) { 
    for(let interceptor of interceptors) { 
    response = interceptor(response); 
    } 
    return response; 
} 

如果攔截的原型如下:

interface Interceptor<T> { 
    (rsp: T): V; 
} 

你能否改變攔截器原型類似

interface Interceptor<T> { 
    (rsp: T): T | Promise<T> | Observable<T>; 
} 

那麼你可以做。 ..

transformResponse(responseObs: Observable<any>) { 
    for(let interceptor of interceptors) { 
    responseObs = responseObs.flatMap(interceptor); 
    } 
    return responseObs; 
} 

這將允許攔截器對響應返回異步轉換(例如重新發出請求)。