假设我有这个服务
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 中做到这一点
感谢您的帮助
答案 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
)
)
);
}