浅谈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('todos'); } }
当组件销毁时,async 管道会自动执行取消订阅操作,进而避免内存泄露的风险。
Angular AsyncPipe 源码片段
@Pipe({name: 'async', pure: false}) export class AsyncPipe implements OnDestroy, PipeTransform { // ... constructor(private _ref: ChangeDetectorRef) {} ngOnDestroy(): void { if (this._subscription) { this._dispose(); } } }
@HostListener
export class TestDirective { @HostListener('click') onClick() { .... } }
需要注意的是,如果使用 @HostListener 装饰器,添加事件监听时,我们无法手动取消订阅。如果需要手动移除事件监听的话,可以使用以下的方式:
// subscribe this.handler = this.renderer.listen('document', "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('http://api.com').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('todos') .takeUntil(this.componetDestroyed).subscribe(console.log); this.posts = this.store.select('posts') .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, 'click'); var result = interval.takeUntil(clicks); result.subscribe(x => console.log(x));
相关推荐:
Atas ialah kandungan terperinci 浅谈Angular中取消订阅. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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

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.

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.

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.

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

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

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

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.
