2

我正在尝试捕获并重试 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(),失败并一直到 console.log('status is 103'),然后什么都没有。任何帮助表示赞赏。

4

1 回答 1

3

您可以使用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
        }
      }
    });
  }
}
于 2018-06-02T17:21:35.430 回答