Angular, как узнать, если время ожидания запроса превышает три раза? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть 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)
    }
  }

Как я могу обработать ошибки тайм-аута и как я могу знать, что они произошли три или более раз. Буду ли я увеличивать каждую ошибку? и просто использовать условие, чтобы сделать эту функцию?

В качестве дополнительного вопроса, как я могу также успешно обработать обратный вызов перехватчику?

Ценю, если кто-то может помочь. Заранее спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

цепочка 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)
    })
...