可观察对象中的“订阅”

时间:2021-04-22 09:41:23

标签: angular rxjs observable

假设我有这个服务

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

export class CacheService {

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

没关系,这不重要

问题在于: 在其他服务中,我有这个返回令牌的方法

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);
        }
      })
    );
  }

我想要,一旦我获得令牌,通过从 CacheService 调用方法 updateTokenCache() 将它设置在缓存中,在 Observable 中。但我想返回第一个值(令牌)

我是否在 tap() 内订阅?我猜不会 this.cacheService.updateTokenCache().subscribe()

所以我找不到一种方法来实现这一点,当然我想在那个 observable 中做到这一点

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以使用 switchMap 缓存令牌并使用 map 返回令牌而不是来自 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
      )
    )
  );
}