Angular如何知道请求的超时时间是否超过三倍?

时间:2018-09-03 05:45:52

标签: angular http timeout httpclient angular-http-interceptors

我有一个 Angular 4应用,在浏览整个应用时,该应用有很多正在进行的 http请求

当HTTP超时发生三次或更多时,我也想做些事情。

http请求中可能还会发生其他错误,但我只想关注超时错误。

我的 http_interceptor 中有以下代码。

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const re = '/u/auth/login';
    const defaultTimeout = 10000;

    if (req.url.search(re) || req.url.search('api.giphy.com/v1') === -1) {
        const headers = new HttpHeaders({
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            // 'Content-Type': 'application/json'
        })
        const dupReq = req.clone({headers});
        const timeOut = Number(req.headers.get('timeout')) || this.defaultTimeout
        return next.handle(dupReq).pipe(
          timeout(timeOut),
          catchError(e => {
            return of(null)
          })
        )
    } else {
        return next.handle(req)
    }
  }

我该如何处理超时错误,又如何知道它们发生了3次或更多次。我会增加每个错误的数量吗?并使用条件来执行该功能?

作为一个奖励问题,我如何也可以成功地对拦截器进行回调处理?

感谢有人可以帮助您。 预先感谢。

1 个答案:

答案 0 :(得分:0)

  

链接在订阅方法上方的retryWhen方法。

import 'rxjs/add/operator/retryWhen';
import 'rxjs/add/operator/delay';
import 'rxjs/add/operator/scan';

.retryWhen((err)=> {
        return err.scan((attempt) => {
            if(attempt>5){
                throw(err);
            }else{
                attempt++;
                console.log("attempt number "+attempt);
                return attempt;
            }
        },0
        ).delay(1000)
    })