首頁 web前端 js教程 淺談Angular取消訂閱

淺談Angular取消訂閱

Jan 16, 2018 am 09:02 AM
angular 取消 訂閱

本文主要介紹了淺談Angular 中何時取消訂閱,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

你可能知道當你訂閱 Observable 物件或設定事件監聽時,在某個時間點,你需要執行取消訂閱操作,進而釋放作業系統的記憶體。否則,你的應用程式可能會出現記憶體洩漏。

接下來讓我們看一下,需要在 ngOnDestroy 生命週期鉤子中,手動執行取消訂閱操作的一些常見場景。

手動釋放資源場景

表單


#
export class TestComponent {

 ngOnInit() {
  this.form = new FormGroup({...});
  // 监听表单值的变化
  this.valueChanges = this.form.valueChanges.subscribe(console.log);
  // 监听表单状态的变化              
  this.statusChanges = this.form.statusChanges.subscribe(console.log);
 }

 ngOnDestroy() {
  this.valueChanges.unsubscribe();
  this.statusChanges.unsubscribe();
 }
}
登入後複製

以上方案也適用於其它的表單控制項。

路由


export class TestComponent {
 constructor(private route: ActivatedRoute, private router: Router) { }

 ngOnInit() {
  this.route.params.subscribe(console.log);
  this.route.queryParams.subscribe(console.log);
  this.route.fragment.subscribe(console.log);
  this.route.data.subscribe(console.log);
  this.route.url.subscribe(console.log);
  
  this.router.events.subscribe(console.log);
 }

 ngOnDestroy() {
  // 手动执行取消订阅的操作
 }
}
登入後複製

Renderer 服務


export class TestComponent {
 constructor(
  private renderer: Renderer2, 
  private element : ElementRef) { }

 ngOnInit() {
  this.click = this.renderer
    .listen(this.element.nativeElement, "click", handler);
 }

 ngOnDestroy() {
  this.click.unsubscribe();
 }
}
登入後複製

Infinite Observables

當你使用interval() 或fromEvent() 運算元時,你建立的是一個無限的Observable 物件。這樣的話,當我們不再需要使用它們的時候,就需要取消訂閱,手動釋放資源。


export class TestComponent {
 constructor(private element : ElementRef) { }

 interval: Subscription;
 click: Subscription;

 ngOnInit() {
  this.interval = Observable.interval(1000).subscribe(console.log);
  this.click = Observable.fromEvent(this.element.nativeElement, 'click')
              .subscribe(console.log);
 }

 ngOnDestroy() {
  this.interval.unsubscribe();
  this.click.unsubscribe();
 }
}
登入後複製

Redux Store


#
export class TestComponent {

 constructor(private store: Store) { }

 todos: Subscription;

 ngOnInit() {
   /**
   * select(key : string) {
   *  return this.map(state => state[key]).distinctUntilChanged();
   * }
   */
   this.todos = this.store.select('todos').subscribe(console.log); 
 }

 ngOnDestroy() {
  this.todos.unsubscribe();
 }
}
登入後複製

無需手動釋放資源場景

AsyncPipe


@Component({
 selector: 'test',
 template: `<todos [todos]="todos$ | async"></todos>`
})
export class TestComponent {
 constructor(private store: Store) { }
 
 ngOnInit() {
   this.todos$ = this.store.select(&#39;todos&#39;);
 }
}
登入後複製

當元件銷毀時,async 管道會自動執行取消訂閱操作,進而避免記憶體洩漏的風險。

Angular AsyncPipe 原始碼片段


@Pipe({name: &#39;async&#39;, pure: false})
export class AsyncPipe implements OnDestroy, PipeTransform {
 // ...
 constructor(private _ref: ChangeDetectorRef) {}

 ngOnDestroy(): void {
  if (this._subscription) {
   this._dispose();
  }
 }
}
登入後複製

@HostListener


export class TestDirective {
 @HostListener(&#39;click&#39;)
 onClick() {
  ....
 }
}
登入後複製

需要注意的是,如果使用@HostListener 裝飾器,新增事件監聽時,我們無法手動取消訂閱。如果需要手動移除事件監聽的話,可以使用以下的方式:


// subscribe
this.handler = this.renderer.listen(&#39;document&#39;, "click", event =>{...});

// unsubscribe
this.handler();
登入後複製

Finite Observable

當你使用HTTP 服務或timer Observable 物件時,你也不需要手動執行取消訂閱操作。


export class TestComponent {
 constructor(private http: Http) { }

 ngOnInit() {
  // 表示1s后发出值,然后就结束了
  Observable.timer(1000).subscribe(console.log);
  this.http.get(&#39;http://api.com&#39;).subscribe(console.log);
 }
}
登入後複製

timer 運算子

運算子簽章

複製程式碼 程式碼如下:


public static timer(initialDelay: number | Date, period: number, scheduler: Scheduler): Observable

##運算子作用


timer 返回一個發出無限自增數列的Observable,有一定的時間間隔,這個間隔由你來選擇。

運算子範例



// 每隔1秒发出自增的数字,3秒后开始发送
var numbers = Rx.Observable.timer(3000, 1000);
numbers.subscribe(x => console.log(x));

// 5秒后发出一个数字
var numbers = Rx.Observable.timer(5000);
numbers.subscribe(x => console.log(x));
登入後複製

最終建議


你應該盡可能少的呼叫unsubscribe() 方法,你可以在RxJS: Don't Unsubscribe 這篇文章中了解與Subject 相關更多資訊。

具體範例如下:


export class TestComponent {
 constructor(private store: Store) { }

 private componetDestroyed: Subject = new Subject();
 todos: Subscription;
 posts: Subscription;

 ngOnInit() {
   this.todos = this.store.select(&#39;todos&#39;)
           .takeUntil(this.componetDestroyed).subscribe(console.log); 
           
   this.posts = this.store.select(&#39;posts&#39;)
           .takeUntil(this.componetDestroyed).subscribe(console.log); 
 }

 ngOnDestroy() {
  this.componetDestroyed.next();
  this.componetDestroyed.unsubscribe();
 }
}
登入後複製

takeUntil 運算子

運算子簽章



public takeUntil(notifier: Observable): Observable<T>
登入後複製

運算子作用


發出來源Observable 發出的值,直到notifier Observable 發出值。

運算元範例



var interval = Rx.Observable.interval(1000);
var clicks = Rx.Observable.fromEvent(document, &#39;click&#39;);
var result = interval.takeUntil(clicks);

result.subscribe(x => console.log(x));
登入後複製
相關推薦:


node.js 發佈訂閱模式的方法

JavaScript發布訂閱模式用法詳

#PHP微信公眾平台開發 訂閱事件處理_PHP教學

##PHP微信公眾平台開發 訂閱事件處理_PHP教學#######

以上是淺談Angular取消訂閱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何取消Win11中的視窗疊加與層疊效果 如何取消Win11中的視窗疊加與層疊效果 Jan 10, 2024 pm 02:50 PM

如何取消Win11中的視窗疊加與層疊效果

取消win11螢幕鎖定教學 取消win11螢幕鎖定教學 Dec 31, 2023 pm 12:29 PM

取消win11螢幕鎖定教學

美團取消訂單怎麼取消 美團取消訂單怎麼取消 Mar 07, 2024 pm 05:58 PM

美團取消訂單怎麼取消

芒果tv自動續費在哪取消 芒果tv自動續費在哪取消 Feb 28, 2024 pm 10:16 PM

芒果tv自動續費在哪取消

微信取消耳朵的符號的詳細步驟 微信取消耳朵的符號的詳細步驟 Mar 25, 2024 pm 05:01 PM

微信取消耳朵的符號的詳細步驟

如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

如何在Ubuntu 24.04上安裝Angular

微信取消訂閱付款的操作步驟 微信取消訂閱付款的操作步驟 Mar 26, 2024 pm 08:21 PM

微信取消訂閱付款的操作步驟

愛奇藝怎麼取消自動續費 愛奇藝取消自動續費怎麼操作 愛奇藝怎麼取消自動續費 愛奇藝取消自動續費怎麼操作 Feb 22, 2024 pm 04:46 PM

愛奇藝怎麼取消自動續費 愛奇藝取消自動續費怎麼操作

See all articles