簡體   English   中英

可觀察的重試/重試當使用flatmap時

[英]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)之后添加重試/重試但沒有運氣。 有什么建議嗎?

retryretry 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM