代码之家  ›  专栏  ›  技术社区  ›  adam0101

覆盖我的可观察变量会杀死当前的订户吗?

  •  2
  • adam0101  · 技术社区  · 6 年前

    @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$ 变量被覆盖。恐怕这会使现有的订户全部消失。这是真的吗?我怎样才能保存它们?

    2 回复  |  直到 6 年前
        1
  •  2
  •   highlysignificantbit    6 年前

    考虑 this.currentUser$ 指向堆上的对象。 方法返回对的引用的副本 当前用户$ . 因此,所有订阅的观察者都将继续收听它们(直到所有的观察者都取消订阅并且被垃圾收集)。

    如果用“force”调用方法,则 当前用户$ 只会指向另一个 Observable<User> 在堆里的其他地方。

        2
  •  0
  •   adam0101    6 年前

    我要把我所做的张贴在这里,以防对其他人有所帮助。我返回一个 BehaviorSubject fetchingCurrentUser

    请让我知道,如果有人看到任何问题,这个或有任何想法如何使它 清洁剂

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