2017-07-24 77 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'方法,所以也许任何交替的解决方案是提供这个链接。如果您知道,请指导我使用此解决方案的方法。 –