Как сделать два сервисных звонка и вернуть ответ в Angular 6 и rxgs - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь сделать два асинхронных HTTP и сохранить ответ, и ответ устанавливается позже.В приведенном ниже коде в настоящее время у меня есть только один http-вызов, и тип ответа - AuthResponse, но теперь я хочу добавить еще один пример http-вызова в методе обновления токена и передать также второй ответ, теперь на касании у меня должно быть два ответа, один ответустанавливается в this.setAuth (auth), а другой ответ устанавливается в this.setAuth1 (auth1).

**this.http.post<AuthResponse1>(REFRESH_TOKEN_URL_1, null, {
          headers: {
            [HEADER_AUTHORIZATION]: 
     `${AUTHORIZATION_HEADER_PREFIX}${this.getRefreshToken1()}`
          }
        })** - this is call I should add in refresh token method and `response type is AuthResponse1`

    refreshToken(): Observable<AuthResponse | AuthenticationErrorAction> {
        return this.http.post<AuthResponse>(REFRESH_TOKEN_URL, null, {
          headers: {
            [HEADER_AUTHORIZATION]: 
     `${AUTHORIZATION_HEADER_PREFIX}${this.getRefreshToken()}`
          }
        }).pipe(
          tap(auth => this.setAuth(auth)),
          catchError(_ => {
            console.info('refresh token is expired, going to login');
            this.clearStorage();
            window.location.reload(true);
            return of(new AuthenticationErrorAction());
          }));
      }

1 Ответ

0 голосов
/ 19 февраля 2019

Вот пример forkJoin.Это происходит от реализации решателя.ForkJoin берет список наблюдаемых и ждет их возвращения.Как только они все вернутся, вы можете извлечь свои результаты на основе индекса:

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<PersonResolverResult> {
    this.overlay.show();
    return forkJoin(
      this.personService.getPeople(),
      this.personService.getPositions(),
      this.personService.getTypes()
    ).pipe(
      map(x => ({people: x[0], positions: x[1], types: x[2]})),
      finalize(() => this.overlay.hide())
    );
  }
...