我如何确保只有一个呼叫与角度拦截器同时进行?

时间:2018-09-10 13:47:24

标签: angular rxjs angular-http-interceptors rxjs6

角度拦截器看起来像这样:

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调用。仅一个电话就足够了。如何确保一次只打一个电话?

1 个答案:

答案 0 :(得分:0)

在您进行api调用的地方,可以使用race观察对象并将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'),
);