2

我正在尝试使用Angulars HttpClient服务通过多次尝试和中间延迟来发出请求。该代码有效,但我在 devTools 网络点击中注意到最终发送并取消了额外的请求。我在这里做错了什么是代码:

return this.http.post<LoginSuccessPayload>('/api/auth/signin', payload).pipe(
  retryWhen(errors => {
    return errors.pipe(
      mergeMap((er: any) => {
        if (er.status === 504 || er.status === 503) {
          return of(er.status).pipe(delay(1000));
        }
        return _throw({message: er.error.message || 'Notification.Core.loginError'});
      }),
      take(3),
      concat(_throw({message: 'Notification.Core.networkError'}))
    );
  })
);

这是FirefoxChrome网络选项卡的图像,应该有三个请求,但它发出了四个并取消了最后一个 在此处输入图像描述

4

2 回答 2

6

这是我解决它的方法。现在三次尝试,每个请求有第二次延迟,并且没有额外的取消请求

 return this.http.post<LoginSuccessPayload>('/api/auth/signin', payload).pipe(
  retryWhen(errors => errors.pipe(
    switchMap((error) => {
      if (error.status === 504 || error.status === 503) {
        return of(error.status);
      }
      return _throw({message: error.error.message || 'Notification.Core.loginError'});
    }),
    scan(acc => acc + 1, 0),
    takeWhile(acc => acc < 3),
    delay(1000),
    concat(_throw({message: 'Notification.Core.networkError'}))
  ))
);
于 2017-11-16T03:29:17.987 回答
2

下面是我的 HttpInterceptorService 代码。代码工作正常,例外。我想根据计数重试。假设我最初的 retryWaitMilliSeconds = 300 和 retryCount = 3

第一次我想用 300 * 1 重试

第二次我想用 300 * 2 重试

第三次我想用 300 * 3 重试

private retryCount = 3;
private retryWaitMilliSeconds = 500;

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        let ok: string;
        const started = Date.now();

        // Handle request
        request =    request.clone({
            setHeaders: {
                "Authorization": "Bearer  XXXXXXXXXXXXXXXXXXX"
            }
        });

        return next.handle(request).pipe(
            tap(event => ok = event instanceof HttpResponse ? 'succeeded' : ''),
            retryWhen(error => error.pipe(concatMap((error, count) => {
                ok = 'failed'
                if (count <= this.retryCount && error.status === 500) {
                    return of(error);
                }
                return throwError(error);
            }), delay(this.retryWaitMilliSeconds),
                tap(err => console.log("Retrying...")))
            ), finalize(() => {
                
            }))
    }
于 2021-05-18T18:42:34.517 回答