我希望能够缓存http调用,但也可以强制刷新刷新。我的服务如下:
@Injectable()
export class UserService {
private currentUser$: Observable<User>;
constructor(private http: HttpClient) { }
getCurrentUser(force = false): Observable<User> {
if (!this.currentUser$ || force) {
this.currentUser$ = this.http.get<User>(`${environment.API_URL}/profiles/me`)
.pipe(
shareReplay(CACHE_SIZE)
);
}
return this.currentUser$;
}
}
如果我调用getCurrentUser(true)
,则currentUser$
变量将被覆盖。恐怕这会消灭所有现有的订户。这是真的?我该如何保存它们?
答案 0 :(得分:0)
考虑this.currentUser$
指向堆上的对象。
您的方法返回对this.currentUser$
的引用的副本。因此,所有订阅的观察者将继续侦听(直到他们全部取消订阅,并且Observable获得垃圾收集)。
如果使用“ force”调用该方法,则this.currentUser$
只会指向堆上其他位置的另一个Observable<User>
。
答案 1 :(得分:0)
我将在此处发布我所做的事情,以防它对其他人有帮助。我只返回BehaviorSubject
的一个实例,并在需要“强制”获取当前用户时将新值推送到该实例。我还添加了一个标志fetchingCurrentUser
,以便在等待对API的第一次调用完成时不会进行多次调用。
请让我知道是否有人对此有任何疑问或对如何使其更清洁 有任何想法。谢谢。
@Injectable()
export class UserService {
private currentUser$: BehaviorSubject<User>;
private fetchingCurrentUser: boolean;
constructor(private http: HttpClient) {
this.currentUser$ = new BehaviorSubject(null);
}
getCurrentUser(force = false): Observable<User> {
if (this.currentUser$.value == null || force) {
this.refreshCurrentUser();
}
return this.currentUser$.asObservable();
}
refreshCurrentUser() {
if (!this.fetchingCurrentUser) {
this.fetchingCurrentUser = true;
this.http.get<User>(`${environment.API_URL}/profiles/me`)
.subscribe(x => {
this.currentUser$.next(x);
this.fetchingCurrentUser = false;
});
}
}