2017-08-07 63 views
4

上重複請求我有一個簡單的請求,我想重複這種情況,如果響應的狀態爲。目前,它看起來像這樣:Angular + RxJS:在狀態碼202

this.http.get(endPoint, { 
    withCredentials: true, 
    headers: this.headers 
}) 
.map((response: Response) => { 
    return response.text() ? response.json() : ''; 
}) 
.catch((error) => this.handleError(error)); 

我試圖與.repeatWhen()但不幸的是,我沒有收到Response對象,我無法通過設置狀態碼驗證。

任何想法我該怎麼做?

+0

你怎麼沒收到'Response'對象'repeatWhen()'當你使用它:你當然可以使用更多的邏輯來控制,如果你重新訂閱,例如()'? – martin

+0

在'repeatWhen()'我收到一個'Subject'對象,而不是'Response' ......你能否把你的想法和闖入者一起展示? –

回答

1

那怎麼repeatWhen()作品的誤解。對此操作符的回調接收一個參數,該參數是一個Observable,它在源完成時按下一個空項目。所以它對你來說並不理想(因爲你沒有權限訪問你需要的Response對象)。

你可以使用retryWhen()代替:

this.http.get(endPoint, { withCredentials: true, headers: this.headers }) 
    .map((response: Response) => { 
     if (response.code === 202) { 
      throw response; 
     } 
     return response; 
    }) 
    .map((response: Response) => { 
     return response.text() ? response.json() : ''; 
    }) 
    .retryWhen(obs => { 
     return obs; // always just resubscribe without any further logic 
    }); 

這將引發response爲錯誤,然後由retryWhen只是重新訂閱抓獲。在`.MAP

.retryWhen(obs => { 
    return obs.filter(...); 
}); 
+0

不錯的解決方案。但是在這種情況下,例如,如果響應是404,它將重新訂閱並再次執行API調用。我怎樣才能避免...回憶只有202? –

+0

@HristoEftimov這就是我在最後提到的。錯誤被推送到Observable'obs',您只能過濾所需的錯誤。 – martin

0

您可以在方法

.catch(res => { 
    return res.status === 202? 
     this.http.get(endPoint): 
     Observable.throw(res); 
}); 
0

再次進行HTTP調用如何使用flatMap:

.flatMap((response:Response) => { 
    if (response.status === 200) { 
     return Observable.of(this.mapResponse(response.json())); 
    } else if (response.status === 202) { 
     return this.http.get(endPoint, { 
      withCredentials: true, 
      headers: this.headers 
     }); 
    } 
}) 
+0

這也是一個選項。但是我需要爲'this.http.get()'創建一個函數,因爲重複的請求可以一次又一次地返回202 :) 爲此,我正在尋找更好的解決方案。 –