首页 > 解决方案 > 从拦截器Angular调用异步函数到catch

问题描述

调用其他函数后,我需要调用异步方法等待。我在 rxjs 方面不是很专家,而且我从未使用过 async/await 调用。

我在拦截器中有这个逻辑

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

    if (req.headers.get('a-header')) {
      const headers = req.headers.delete('a-header');

      return next.handle(req.clone({ headers, withCredentials: true }));
    }

    return next.handle(req.clone({ withCredentials: true })).catch((err: Error) => {
      if (!(err instanceof HttpErrorResponse) || (err as HttpErrorResponse).status !== 401) {
        return throwError(err);
      }
      this.error.notify401Error(err);
      //NEED TO AWAIT THE NEXT RESPONSE
      this.callXApi(next);
      //AND THEN CONTINUE WITH THIS CALL
      this.redirectSignedOut();
      return empty();
    });
  }

请注意,我需要调用CallXApi,等到完成,然后继续使用redirectSignedOut函数。

  private callXApi(): void {
    const { uri } = this.config;

    this.httpClient
      .delete(uri, { withCredentials: true })
      .subscribe(() => { console.log('completed.') }, (err) => throwError(err));
  }

我怎样才能做到这一点?

更新

我通过更改下一个代码实现了这一点

return <any>next.handle(req.clone({ withCredentials: true })).catch(async (err: Error) => {
  if (!(err instanceof HttpErrorResponse) || (err as HttpErrorResponse).status !== 401) {
    return throwError(err);
  }
  this.errorEventService.notify401Error(err);
  await this.callXApi();

  return EMPTY;
});

标签: javascriptangular

解决方案


试试这个:

 return next.handle(req.clone({ withCredentials: true })).catch(async (err: Error) => {
  if (!(err instanceof HttpErrorResponse) || (err as HttpErrorResponse).status !== 401) {
    return throwError(err);
  }
  this.error.notify401Error(err);
  //NEED TO AWAIT THE NEXT RESPONSE
  await this.callXApi(next);
  //AND THEN CONTINUE WITH THIS CALL
  this.redirectSignedOut();
  return empty();
});

推荐阅读