代码之家  ›  专栏  ›  技术社区  ›  Anjil Dhamala

在收到特定http状态时重试http调用

  •  2
  • Anjil Dhamala  · 技术社区  · 6 年前

    我正在尝试捕获并重试103 Http错误状态响应。如果服务器理解请求并将开始处理它,但资源立即不可用,则服务调用返回103。我想做的是,当我收到103时,我想每5秒重试获取资源,最多5次,最后我希望它超时并返回404错误。这就是我目前掌握的情况

    getDoc() {
      return this.getError()
        .retryWhen((errors: any) => {
          return errors.switchMap((sourceError) => {
            console.log(sourceError);
            if (sourceError.status === 103) {
              console.log('status is 103');
              const notFoundError = new HttpErrorResponse({
                status: 404
              });
              return errors.delay(5000).take(5).concat(Observable.throw(notFoundError));
            }
            return Observable.throw(sourceError);
          });
        })
        .toPromise();
    }
    
    getError() {
      console.log('getting error');
      return Observable.throw(new HttpErrorResponse({
        status: 103
      }));
    }
    

    使用getError()函数,我试图模拟103,因为服务器还没有发送103。也许getError()不是httpError响应的良好表示。我不知道还有什么方法可以重现并抛出一个可观察到的错误。

    无论如何,这个设置不起作用。它调用getError(),失败并一直运行到控制台。日志('status is 103'),之后什么都没有。感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  3
  •   RamY    6 年前

    你可以用 HttpInterceptor .

    @Injectable()
    export class ServiceCallProvider implements HttpInterceptor {
    
    public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    
        return next.handle(request).do((event: HttpEvent<any>) => {
          if (event instanceof HttpResponse) {
            // do stuff with response if you want
          }
        }, (err: any) => {
          if (err instanceof HttpErrorResponse) {
            if (err.status === 103) {
              // handle logic
            }
          }
        });
      }
    }