[英]Observable retry / retryWhen with flatmap
我有以下代碼來獲取id,然后獲取與id相關的數據。
process(): Observable<any> {
let id: number;
return this.getId().flatMap(
(response: number) => {
id = response;
return this.getData(id)
}
).flatMap(
(data: any) => {
return Observable.of(data);
}
);
}
getData(id: number): Observable<any> {
// retry if response.status is not complete
return this.service.getData(id).map(response => return response.data);
}
我想在getData方法上添加重試邏輯,直到response.status沒有完成。 我嘗試在this.getData(id)之后添加重試/重試但沒有運氣。 有什么建議嗎?
retry
和retry
retryWhen
適合於錯誤處理,這意味着源可觀察源必須為這些運算符產生錯誤才能產生效果。 我想在你的情況下,你想重試不是出錯,而是在你不喜歡的狀態。
實現這一目標的最簡單方法可能是在某個時間間隔內進行服務調用,並以您想要的狀態進行第一次響應:
getData(id) {
return Observable.interval(100)
// make 5 attempts to get the data
.take(5)
.concatMap(() => this.service.getData(id))
.filter(response => response.status === "complete")
.take(1)
.map(response => response.data)
}
現在, getData()
返回一個observable,該observable發出一個對應於具有“完成”狀態的響應的值,然后完成, 或者在嘗試獲取具有所需狀態的數據失敗5次后完成而不發出任何值(更新的答案)回應評論) 。
更新:
當然,可以將具有“錯誤”狀態的響應轉換為錯誤並使用retry
功能,如您所建議的那樣:
getData(id) {
return this.service.getData(id)
.concatMap(response => response.status === "complete" ?
Observable.of(response) :
Observable.throw("Bad status"))
.map(response => response.data)
.retry(5);
}
如果出現問題,此代碼將嘗試獲取最多6次數據(1次初始+5次重試),然后將產生您必須處理的錯誤,例如使用catch
運算符。 一個缺點是這種方式不能區分“真實”錯誤(例如網絡故障)和錯誤狀態產生的錯誤,但這可以通過retryWhen
來處理。
我試過重試方法,它的工作原理。
(Observable ...).retry(2).map(...).subscribe(...)
當我進行http呼叫並且響應是例如404時,它重試該呼叫兩次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.