2017-07-24 60 views
0

錯誤代碼的HTTP請求: -如何處理多個錯誤代碼的場景在以下

400 - 對響應到達執行single重試without delay

502,503和504執行eight次數的重試與1000 Sec delay

我的代碼如下: -

private _getData('loginKey', body, headers) { 
return this._http.post('url', body, { headers: headers }) 
    .map((response: Response) => response.json()) 
    .retryWhen(errors => { 
    return errors 
     .mergeMap((error) => this.handleError(error)) 
     .delay(2000) 
     .take(8); 
    }); 
} 

public handleError(error: Response | any): Observable<any> { 
    if (error.status === 400) { // retry 1 time and with no delay 
    return Observable.of(error); 
    } else { // retry confgured times and configured delay 
    return Observable.of(error); 
    } 
} 

我的問題是如何根據上述錯誤代碼改變delaytake值:

如果error.status是然後delay value 0take value 1

如果error.status502,503和504然後delay value 2000take value 8

+0

如果我的回答回答你的問題,你會接受嗎? –

+0

是肯定它是否會有所幫助。 –

+0

我已經更新我的答案 –

回答

1

做到這一點,最簡單的方法是在服務,將重新定義一個函數打開你想要的值。

例如:

let errorStatus; 
private _getData('loginKey', body, headers) { 
return this._http.post('url', body, { headers: headers }) 
    .map((response: Response) => response.json()) 
    .retryWhen(errors => { 
    return errors 
     .mergeMap((error) => { 
      errorStatus = error.status; 
      this.handleError(error)) 
     }) 
     .delay(ResponseService.getDelay(errorStatus)) 
     .take(ResponseService.getRetries(errorStatus)); 
    }); 
} 
在ResponseService.js

...

function getDelay(status) { 
    let val = 0; 
    switch(status) { 
     case 400: 
      val = 0; 
      break; 
     ... 
    } 
    return val; 
} 

function getRetries(status) { 
    let val = 0; 
    switch(status) { 
     case 400: 
      val = 1; 
      break; 
     ... 
    } 
    return val 
} 
+0

但'error.status'不是'delay'訪問和'take' 有關如何訪問它的任何想法。 –

+1

我更新了工作。你應該能夠捕捉到錯誤的值,所以你可以使用它,我必須嘗試您的解決方案,但仍無法訪問'errorstatus'內'delay'和'take',因爲這是在調用之前mergeMap –

+0

的範圍之外內部代碼運行'mergeMap'。所以這個代碼的任何解決方案或任何可用的替代解決方案。 **請訪問以下鏈接:** http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html 我沒有我用一個'可觀察uses'完整的知識從這個鏈接'mergeMap','delay'和'take'方法,所以也許任何交替的解決方案是提供這個鏈接。如果您知道,請指導我使用此解決方案的方法。 –