Rumah hujung hadapan web tutorial js 浅谈Angular中取消订阅

浅谈Angular中取消订阅

Jan 16, 2018 am 09:02 AM
angular Batal langganan

本文主要介绍了浅谈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();
 }
}
Salin selepas log masuk

以上方案也适用于其它的表单控件。

路由


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() {
  // 手动执行取消订阅的操作
 }
}
Salin selepas log masuk

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();
 }
}
Salin selepas log masuk

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();
 }
}
Salin selepas log masuk

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();
 }
}
Salin selepas log masuk

无需手动释放资源场景

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;);
 }
}
Salin selepas log masuk

当组件销毁时,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();
  }
 }
}
Salin selepas log masuk

@HostListener


export class TestDirective {
 @HostListener(&#39;click&#39;)
 onClick() {
  ....
 }
}
Salin selepas log masuk

需要注意的是,如果使用 @HostListener 装饰器,添加事件监听时,我们无法手动取消订阅。如果需要手动移除事件监听的话,可以使用以下的方式:


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

// unsubscribe
this.handler();
Salin selepas log masuk

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);
 }
}
Salin selepas log masuk

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));
Salin selepas log masuk

最终建议

你应该尽可能少的调用 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();
 }
}
Salin selepas log masuk

takeUntil 操作符

操作符签名


public takeUntil(notifier: Observable): Observable<T>
Salin selepas log masuk

操作符作用

发出源 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));
Salin selepas log masuk

相关推荐:

node.js 发布订阅模式的方法

JavaScript发布订阅模式用法详解

PHP微信公众平台开发 订阅事件处理_PHP教程

Atas ialah kandungan terperinci 浅谈Angular中取消订阅. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk membatalkan tindanan tetingkap dan kesan lata dalam Win11 Bagaimana untuk membatalkan tindanan tetingkap dan kesan lata dalam Win11 Jan 10, 2024 pm 02:50 PM

Tetingkap lalai yang bertindih dalam win11 sangat menjengkelkan, jadi ramai rakan ingin membatalkan tetingkap yang bertindih, tetapi tidak tahu cara membatalkannya, sebenarnya, kami hanya perlu menggunakan perisian yang berkaitan. Cara membatalkan tingkap bertindih dalam win11 Kaedah 1: Batal melalui bar tugas 1. Win11 tidak mempunyai fungsi pembatalan sendiri, jadi kita perlu memuat turun "startallback" 2. Selepas muat turun selesai, "unzip" pakej termampat penyahmampatan selesai, buka folder, jalankan program pemasangan bergambar untuk menyelesaikan pemasangan. . 3. Selepas pemasangan selesai, anda perlu membuka "Panel Kawalan" dan kemudian menukar "Lihat oleh" di sudut kanan atas kepada "Ikon Besar". 4. Dengan cara ini, anda boleh mencari "startallback", klik untuk membukanya dan masukkan "Tugas" di sebelah kiri

Tutorial untuk membatalkan kunci skrin win11 Tutorial untuk membatalkan kunci skrin win11 Dec 31, 2023 pm 12:29 PM

Untuk melindungi kandungan skrin atau menjimatkan kuasa, kami sering menghidupkan penyelamat skrin, tetapi mendapati ia sangat menyusahkan untuk memasukkan semula kunci kata laluan setiap kali selepas keluar dari penyelamat skrin, jadi bagaimana untuk membatalkan kunci skrin win11? , ia boleh dimatikan dalam tetapan penyelamat skrin. Cara membatalkan kunci skrin win11: 1. Mula-mula, kita klik kanan ruang kosong pada desktop dan buka "Peribadikan" 2. Kemudian cari dan buka "Antara Muka Skrin Kunci" di sebelah kanan 3. Kemudian buka "Screen Saver " dalam tetapan yang berkaitan di bahagian bawah 4. Akhir sekali, tandakan "Tunjukkan skrin log masuk semasa pemulihan" dan sahkan untuk menyimpan untuk membatalkan kunci skrin.

Bagaimana untuk membatalkan pesanan dengan Meituan Bagaimana untuk membatalkan pesanan dengan Meituan Mar 07, 2024 pm 05:58 PM

Apabila membuat pesanan menggunakan Meituan, pengguna boleh memilih untuk membatalkan pesanan yang mereka tidak mahu Ramai pengguna tidak tahu cara membatalkan pesanan Meituan Pengguna boleh mengklik halaman Saya untuk memasukkan pesanan yang akan diterima dibatalkan dan klik Batal. Cara membatalkan pesanan dengan Meituan 1. Pertama, klik pada Meituan My Page untuk memasukkan pesanan yang akan diterima. 2. Kemudian klik untuk memasukkan pesanan yang perlu dibatalkan. 3. Klik Batalkan Pesanan. 4. Klik OK untuk membatalkan pesanan. 5. Akhir sekali, pilih sebab pembatalan mengikut situasi peribadi anda dan klik Hantar.

Langkah terperinci untuk membatalkan simbol telinga pada WeChat Langkah terperinci untuk membatalkan simbol telinga pada WeChat Mar 25, 2024 pm 05:01 PM

1. Simbol telinga ialah mod penerima suara Pertama, kami membuka WeChat. 2. Klik saya di penjuru kanan sebelah bawah. 3. Klik Tetapan. 4. Cari sembang dan klik untuk masuk. 5. Nyahtanda Gunakan earpiece untuk memainkan suara.

Di mana untuk membatalkan pembaharuan automatik Mango TV? Di mana untuk membatalkan pembaharuan automatik Mango TV? Feb 28, 2024 pm 10:16 PM

Apabila ramai pengguna mengalami Mango TV, sebuah perisian video, mereka memilih untuk menjadi ahli untuk menikmati lebih banyak sumber filem dan televisyen serta perkhidmatan yang lebih komprehensif. Dalam proses menggunakan perkhidmatan keahlian Mango TV, sesetengah pengguna akan memilih untuk menghidupkan fungsi pembaharuan automatik untuk menikmati diskaun bagi memastikan mereka tidak terlepas sebarang kandungan menarik. Walau bagaimanapun, apabila pengguna tidak lagi memerlukan perkhidmatan keahlian atau ingin menukar kaedah pembayaran, membatalkan fungsi pembaharuan automatik adalah satu perkara yang sangat penting untuk melindungi keselamatan harta benda Bagaimana untuk membatalkan perkhidmatan pembaharuan automatik dari Mango TV Datang dan ikuti artikel ini untuk mengetahui lebih lanjut! Bagaimana untuk membatalkan pembaharuan automatik keahlian di Mango TV? 1. Mula-mula masukkan [Saya] dalam APP mudah alih Mango TV, dan kemudian pilih [Keahlian VIP]. 2. Kemudian cari [Tube

Bagaimana untuk memasang Angular pada Ubuntu 24.04 Bagaimana untuk memasang Angular pada Ubuntu 24.04 Mar 23, 2024 pm 12:20 PM

Angular.js ialah platform JavaScript yang boleh diakses secara bebas untuk mencipta aplikasi dinamik. Ia membolehkan anda menyatakan pelbagai aspek aplikasi anda dengan cepat dan jelas dengan memanjangkan sintaks HTML sebagai bahasa templat. Angular.js menyediakan pelbagai alatan untuk membantu anda menulis, mengemas kini dan menguji kod anda. Selain itu, ia menyediakan banyak ciri seperti penghalaan dan pengurusan borang. Panduan ini akan membincangkan cara memasang Angular pada Ubuntu24. Mula-mula, anda perlu memasang Node.js. Node.js ialah persekitaran berjalan JavaScript berdasarkan enjin ChromeV8 yang membolehkan anda menjalankan kod JavaScript pada bahagian pelayan. Untuk berada di Ub

Bagaimana untuk membatalkan pembaharuan automatik pada iQiyi Bagaimana untuk membatalkan pembaharuan automatik pada iQiyi Bagaimana untuk membatalkan pembaharuan automatik pada iQiyi Bagaimana untuk membatalkan pembaharuan automatik pada iQiyi Feb 22, 2024 pm 04:46 PM

Anda boleh membuka fungsi pembaharuan automatik pengurusan pada antara muka Ahli VIP Emas Saya untuk membatalkan. Tutorial Model Berkenaan: Sistem Huawei P50: HarmonyOS2.0 Versi: Analisis iQiyi 12.1.0 1 Buka apl iQiyi pada telefon anda, dan kemudian masukkan halaman Saya. 2 Kemudian klik Keahlian VIP Emas di bahagian atas halaman saya, dan kemudian klik Urus Pilihan Pembaharuan Automatik. 3. Klik Batalkan pembaharuan automatik dalam tetingkap pop timbul Jika anda tidak berminat, teruskan batal. 4Akhirnya sahkan untuk mematikan pembaharuan automatik dan klik Saya faham, hanya menolaknya dengan kejam. Tambahan: Cara membatalkan fungsi pembaharuan automatik pada iQiyi iPhone 1. Buka tetapan pada telefon, dan kemudian klik [AppleID] di bahagian atas antara muka tetapan. 2Klik [Langgan] pada antara muka AppleID untuk memilih

Langkah-langkah operasi untuk membatalkan pembayaran langganan di WeChat Langkah-langkah operasi untuk membatalkan pembayaran langganan di WeChat Mar 26, 2024 pm 08:21 PM

1. Klik pilihan [iTunesStore dan AppStore] dalam tetapan telefon. 2. Klik [Lihat AppleID], dan kemudian masukkan kata laluan log masuk. 3. Masukkan antara muka [Account Settings] dan klik [Maklumat Pembayaran]. 4. Semak kaedah pembayaran sebagai [Tiada] dan klik [Selesai]. Selepas selesai, kembali ke antara muka WeChat Pada masa ini, anda akan menerima mesej [Pemberitahuan Penamatan Kontrak Berjaya] dan WeChat tidak lagi akan memotong yuran secara automatik.

See all articles