0
votes

Let's say that I have this services

    export class CacheApiService {
    ...   
      updateTokenCache() {
        const url = `${this.consultationBaseURL}/cache/idm/updateTokenCache`;
        return this.httpClient.put<any>(url, {});
      }
    }

AND

export class CacheService {

    updateTokenCache() {
      return this.cacheApiService.updateTokenCache().pipe(
        catchError(err => throwError(err)),
        tap( res => {
          this.logger.info(`CacheService - updateTokenCache()`, res);
        })
      );
    }
}

whatever, this is not important

the issue is there: In an other service i have this method that returns a token

refreshToken(): Observable<string> {

    this.logger.debug('refreshToken()');

    return this.impersonateUser().pipe(
      takeUntil(this.destroySubject$),
      tap( token => {
        this.logger.info('token', token);
        if (token) {
          this.refreshTokenState(token);
          this.storeUserPrincipal(token);
        }
      })
    );
  }

I want, once i get the token, set it in cache by calling the method updateTokenCache() from the CacheService, inside that Observable. But i want to return the first value (the token)

Do i subscribe to inside the tap() ? i guess not this.cacheService.updateTokenCache().subscribe()

So i Cannot find a way to achieve this, and of course i want to do that inside that observable

Thank you for your help

1

1 Answers

0
votes

You could use switchMap to cache the token and use map to return back the token instead of the response from the updateTokenCache() observable.

refreshToken(): Observable<any> {
  this.logger.debug('refreshToken()');

  return this.impersonateUser().pipe(
    takeUntil(this.destroySubject$),
    tap(token => {
      this.logger.info('token', token);
      if (token) {
        this.refreshTokenState(token);
        this.storeUserPrincipal(token);
      }
    }),
    switchMap((token: any) => 
      this.cacheService.updateTokenCache(token).pipe(
        map(() => token)    // <-- send back the token here
      )
    )
  );
}