Angular Http 请求出错后重试

Posted Angular完全开发手册

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular Http 请求出错后重试相关的知识,希望对你有一定的参考价值。

在 Angular 中,对 http 请求的错误处理非常重要。有时候客户端由于网络原因,或服务端因为出了些异常,导致请求失败。如果我们能重新请求一下,就会获得正确的响应。今天我们主要来说一下,对于失败的请求,如何重新发起。

  • retry

 
   
   
 
  1. http.get('url').pipe(

  2.    retry(3),

  3.    catchError(error=> this.handleError(error))

  4. )

上面的代码在请求失败后,会重新请求三次,如果三次请求同样都失败了,才会触发error,走进 catchError的处理逻辑中。

上面的代码问题是三次请求都是立即发起的,间隔时间短,服务器也许还没有从异常中恢复。三次请求连续失败的可能性较大。我们希望在请求失败后,延迟两秒再次发起请求,这样成功机率大些。这就需要用到另一个操作符。

  • retryWhen

 
   
   
 
  1. http.get('url').pipe(

  2.    retryWhen(error=>error.pipe(delay(2000))),

  3.    catchError(error=>this.handleError(error))

  4. )

可以看到,当请求失败后,每隔两秒,就会再次发出请求。这时候问题又来了,如果服务器这个接口真的出问题了,总不能无止境的请求下去,要限制重试次数。

 
   
   
 
  1. http.get('url').pipe(

  2.    retryWhen(error=>error.pipe(delay(2000),take(2))),

  3.    catchError(error=>this.handleError(error))

  4. )

现在,我们最多试两次,就不试了,还不成功就让它走catchError的流程。但是,你会发现即使请求都失败了,也不会走 catchError的流程。

这是因为 retryWhen 重试两次后,就 complete 了。它并没有将 error 传递给后面的操作符。如何解决?我们还需要一个操作符。

  • scan

 
   
   
 
  1. http.get('url').pipe(

  2.    retryWhen(error=>{

  3.        error.pipe(

  4.            scan((retryCount, _error)=>{

  5.                retryCount+=1;

  6.                if(retryCount>2){

  7.                    throw _error;

  8.                }else{

  9.                    return retryCount

  10.                }

  11.            },0),

  12.            delay(2000)

  13.        )

  14.    }),

  15.    catchError(error=>this.handleError)

  16. )

通过 scan 我们记录并叠加了重试次数,如果重试次数大于2次,就抛出错误,而这个错误,正是 http 的错误对象。这样,catchError就可以抓到并处理了。试试吧!


以上是关于Angular Http 请求出错后重试的主要内容,如果未能解决你的问题,请参考以下文章

Angular 7 - 如何在某些响应状态代码上重试 http 请求?

URLSession dataTaskPublisher 在特定错误延迟后重试

错误:服务器错误 服务器遇到临时错误,无法完成您的请求。请在 30 秒后重试。(GCP)

python unittest 运行失败后重试

利用feign的重试机制刷新过期的请求Token

是否在就绪探测失败后重试 Pod