2016-09-13 37 views
2

當一個HTTP請求失敗時,我想間隔兩次重試。如果第三次再次失敗,我想把這個錯誤轉發給觀察員。我在最後一部分遇到麻煩。從DataService.get()RxJS 5與角2:重試失敗可觀察,但然後轉發錯誤

HTTP請求

return this.http.get(url,options) 
    .retryWhen(errors => errors.delay(1000).take(2)) 
    .catch((res)=>this.handleError(res)); 

認購

this.dataSvc.get('/path').subscribe(
    res => console.log(res), 
    err => console.error(err), 
    () => console.log('Complete') 
); 

我的服務器設置爲始終返回一個錯誤(狀態400 Bad request)。

  • 我想申請做出第二請求,使第3的要求,則拋出錯誤由this.handleError()

  • 實際發生的被抓:應用程序發出第二請求,使得第三,然後可觀察到完成沒有錯誤( 「完成」 打印到控制檯)

Angular 2 rc.6RxJS 5 beta 11Typescript 2.0.2

+0

看看https://stackoverflow.com/questions/39928183/angular-2-rxjs-observable- retrywhen-filter-retry-on-error-status/41720854#41720854 –

+0

@ stely000感謝您的鏈接。你的解決方案與我想出的相近(我在發佈問題的同一天下面寫了一個答案) – BeetleJuice

回答

4

我用the scan operator

return this.http.get(url,options) 
    .retryWhen(errors => errors.delay(1000).scan((acc,source,index)=>{ 
     if(index) throw source; 
    })) 
    .catch((res)=>this.handleError(res)); 

scan()參數:

  • acc:一個累加器(認爲Array.reduce())。值(或異常)由先前的操作(delay(),這本身從errors其轉發)發出
  • :如果修改並返回它,新的值將作爲未來執行acc參數
  • source提供index:當前發射值的索引(從零開始)

這使得3個HTTP請求(不知道爲什麼;我會期待2)。在第三次失敗,它拋出source - 發出的錯誤 - 被捕獲handleError()