覆盖我的可观察变量会杀死当前订阅者吗?
Will overwriting my observable variable kill current subscribers?
我希望能够缓存一个 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$
变量将被覆盖。恐怕这会消灭所有现有订阅者。这是真的?我怎样才能保存它们?
将 this.currentUser$
视为指向堆上的对象。
您的方法 returns 对 this.currentUser$
的引用的副本。所以所有订阅的观察者将继续听他们的(直到他们都取消订阅并且 Observable 被垃圾收集)。
如果您使用 "force" 调用该方法,this.currentUser$
将指向堆上其他地方的另一个 Observable<User>
。
我将 post 我在这里所做的,以防对其他人有所帮助。我 return 一个 BehaviorSubject
的单个实例,只要我需要 "force" 获取当前用户,就向它推送新值。我还添加了一个标志 fetchingCurrentUser
,这样我就不会在等待对 API 的第一次调用完成时进行多次调用。
如果有人发现任何问题或对如何制作它有任何想法,请告诉我 cleaner。谢谢
@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;
});
}
}
我希望能够缓存一个 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$
变量将被覆盖。恐怕这会消灭所有现有订阅者。这是真的?我怎样才能保存它们?
将 this.currentUser$
视为指向堆上的对象。
您的方法 returns 对 this.currentUser$
的引用的副本。所以所有订阅的观察者将继续听他们的(直到他们都取消订阅并且 Observable 被垃圾收集)。
如果您使用 "force" 调用该方法,this.currentUser$
将指向堆上其他地方的另一个 Observable<User>
。
我将 post 我在这里所做的,以防对其他人有所帮助。我 return 一个 BehaviorSubject
的单个实例,只要我需要 "force" 获取当前用户,就向它推送新值。我还添加了一个标志 fetchingCurrentUser
,这样我就不会在等待对 API 的第一次调用完成时进行多次调用。
如果有人发现任何问题或对如何制作它有任何想法,请告诉我 cleaner。谢谢
@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;
});
}
}