簡體   English   中英

RxJS:BehaviorSubject取消訂閱

[英]RxJS: BehaviorSubject unsubscribe

我對可觀察到的新手很擔心內存泄漏。 如果我創建以下內容:

private client =  new BehaviorSubject("");
clientStream$ = this.client.asObservable();

和susbscirbe在他們看來像這樣:

this.clientService.clientStream$.subscribe(
  client => {
    this.client = client;
  }
}

我需要取消訂閱嗎? 如果我調用client.getValue()怎么辦?

我需要取消訂閱嗎?

大概。

如果您正在設計一個將完成的主題 - 即,如果您打算調用client.complete() (或者如果您使用rxjs 4則調用client.onCompleted() ) - 那么這將自動拆除訂閱。

但通常情況下,您的行為主體會在某種服務中持續存在,並且您不希望它完成。 在這種情況下,您需要取消訂閱。 您可以通過兩種方式取消訂閱:

1)手動:

當你調用.subscribe時,你會收到一個訂閱對象。 如果你在它.dispose()調用.unsubscribe() (rxjs 4中的.dispose() ),你將取消訂閱。 例如:

const subscription = this.clientService.clientStream$
    .subscribe(client => this.client = client);

setTimeout(() => subscription.unsubscribe(), 10000); // unsubscribe after 10 seconds

2)基於另一個可觀察的自動。 如果您經常在應用程序中使用可觀察對象,您可能會發現這種方法非常方便。

Observable有一個.takeUntil運算符,您可以將其傳遞給另一個observable。 當第二個observable發出一個值時,它會為你取消訂閱。 這可以讓你預先描述什么條件應該拆除你的觀察。 例如:

this.clientService.clientStream$
    .takeUntil(Observable.timer(10000))
    .subscribe(client => this.client = client);

如果我調用client.getValue()怎么辦

這將同步為您提供當前值。 你根本沒訂閱。 從好的方面來說,這意味着您無需取消訂閱。 但是,在不利方面,如果您不想看到價值何時發生變化,您為什么要使用行為主題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM