如何让Session Token仅获取一次以支持多次请求?
解决方案
要实现getToken()仅执行一次,后续调用getEntity()复用已有Token,你可以通过缓存Token的Observable来实现,利用RxJS的shareReplay操作符确保Token请求只触发一次,且所有订阅者共享结果。
修改后的代码如下:
import { Injectable, inject } from '@angular/core'; import { shareReplay, switchMap } from 'rxjs/operators'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) // 确保服务是单例,全局共享Token缓存 export class SomeService { // 缓存Token的Observable,shareReplay(1)保留最近1次结果,供后续订阅复用 private readonly token$ = this.getToken().pipe(shareReplay(1)); private getToken(): Observable<string> { return inject(TokenService).get(); } getEntity() { // 直接复用缓存的token$,不再每次调用getToken() return this.token$.pipe( switchMap(token => inject(EntityService).get(token)) ); } }
关键说明:
- 单例服务:通过
providedIn: 'root'确保SomeService是全局单例,所有组件共享同一个Token缓存,避免重复获取。 - shareReplay(1):这个操作符会订阅源Observable(即
getToken()的请求)一次,将结果缓存,后续所有订阅者直接获取缓存的结果,不会重新触发Token请求。 - 私有getToken:将
getToken()改为私有,避免外部直接调用,确保Token获取逻辑完全由服务内部管控。
这样无论多少个组件调用getEntity(),Token只会被获取一次,后续所有请求都会复用已有的Token结果,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

