首页 > 解决方案 > 我如何确保只有一个呼叫与角度拦截器同时进行?

问题描述

角度拦截器如下所示:

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

  catchError(err => {
      if (err instanceof HttpErrorResponse) {
          if (err.status === 401) {

              this.auth.getToken().subscribe((refreshOk: boolean) => {
                if (!refreshOk) {
                  this.router.navigate(["/login"]);
                }
              });
          }
      }

      return Observable.throw(err);
  })
);

问题是一次进行了四个不同的 api 调用。所以四个 getToken 调用是同时进行的。一个电话就够了。如何确保一次只拨打一个电话?

标签: angularrxjsangular-http-interceptorsrxjs6

解决方案


在您进行 api 调用的地方,您可以使用raceobservable 并将您的 api 调用放入其中。第一个响应的获胜,其他的则被拒绝。

// RxJS v6+
race(
  api.get('http://abc/foo'),
  api.get('http://abc/bar'),
  api.get('http://abc/baz'),
);

// RxJS v5
Observable.race(
  api.get('http://abc/foo'),
  api.get('http://abc/bar'),
  api.get('http://abc/baz'),
);

推荐阅读