Как я могу гарантировать, что только один вызов выполняется одновременно с угловым перехватчиком?

Угловой перехватчик выглядит так:

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. Достаточно будет одного звонка. Как я могу гарантировать, что только один вызов будет сделан одновременно?


person Juri    schedule 10.09.2018    source источник


Ответы (1)


В том месте, где вы выполняете вызовы 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'),
);
person Serkan Sipahi    schedule 11.09.2018