首页 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教程

以上是浅谈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 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前 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窗口重叠层叠窗口怎么取消方法一:通过任务栏取消1、win11没有自带的取消功能,因此我们需要下载一个“startallback”2、下载完成后,“解压”该压缩包,解压完成后,打开文件夹,运行图示安装程序完成安装。。3、安装完成后,需要打开“控制面板”,然后把右上角“查看方式”改为“大图标”。4、这样就可以在其中找到“startallback”了,点击打开它,进入左边“任务

取消win11屏幕锁教程 取消win11屏幕锁教程 Dec 31, 2023 pm 12:29 PM

为了保护屏幕内容或省电我们经常会开启屏保,但是发现每次屏保退出后都要重新输入密码锁非常麻烦,那么win11屏幕锁怎么取消呢,其实在屏保设置里就能关闭。win11屏幕锁怎么取消:1、首先我们右键桌面空白处,打开“个性化”2、然后在右边找到并打开“锁屏界面”3、随后打开最下面相关设置里的“屏幕保护程序”4、最后勾选“在恢复时显示登录屏幕”并确定保存就能取消屏幕锁了。

美团取消订单怎么取消 美团取消订单怎么取消 Mar 07, 2024 pm 05:58 PM

用户在使用美团下单时可以选择不想要的订单取消,有很多用户不知道美团取消订单怎么取消,用户可以在我的页面中点击进入订单待收货选择需要取消的订单点击取消。美团取消订单怎么取消1、首先在美团我的页面中点击进入订单待收货。2、然后点击进入需要取消的订单。3、点击取消订单。4、点击确定取消订单。5、最后根据个人情况选择取消原因后点击提交即可。

芒果tv自动续费在哪取消 芒果tv自动续费在哪取消 Feb 28, 2024 pm 10:16 PM

许多用户在体验芒果TV这款视频软件时,为了享受更多的影视资源和更全面的服务,都会选择开通会员。而在使用芒果TV会员服务的过程中,部分用户会选择开启自动续费功能享受优惠,以确保不会错过任何精彩内容。然而,当用户不再需要会员服务或希望更改支付方式时,取消自动续费功能就是保护财产安全非常重要的一件事,究竟该如何取消芒果tv的自动续费服务呢,想要了解的用户们就快来跟着本文一起详细了解一下吧!芒果tv怎么取消会员自动续费?1、首先进入芒果tv手机APP里面的【我的】,再选择【VIP会员】。2、然后找到【管

微信取消耳朵的符号的详细步骤 微信取消耳朵的符号的详细步骤 Mar 25, 2024 pm 05:01 PM

1、耳朵符号是语音听筒模式,首先我们打开微信。2、点击右下角的我。3、点击设置。4、找到聊天点击进入。5、取消勾选使用听筒播放语音即可。

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

Angular.js是一种可自由访问的JavaScript平台,用于创建动态应用程序。它允许您通过扩展HTML的语法作为模板语言,以快速、清晰地表示应用程序的各个方面。Angular.js提供了一系列工具,可帮助您编写、更新和测试代码。此外,它还提供了许多功能,如路由和表单管理。本指南将讨论在Ubuntu24上安装Angular的方法。首先,您需要安装Node.js。Node.js是一个基于ChromeV8引擎的JavaScript运行环境,可让您在服务器端运行JavaScript代码。要在Ub

爱奇艺怎么取消自动续费 爱奇艺取消自动续费怎么操作 爱奇艺怎么取消自动续费 爱奇艺取消自动续费怎么操作 Feb 22, 2024 pm 04:46 PM

可以在我的黄金VIP会员界面打开管理自动续费功能进行取消。教程适用型号:华为P50系统:HarmonyOS2.0版本:爱奇艺12.1.0解析1打开手机上的爱奇艺app,接着进入我的页面。2然后在我的页面点击上方的黄金VIP会员,接着点击管理自动续费选项。3在弹出的窗口中点击取消自动续费,不感兴趣,继续取消。4最后确认关闭自动续费并点击我知道了,残忍拒绝即可。补充:苹果手机爱奇艺怎么取消自动续费功能1打开手机上的设置,接着在设置界面点击顶部的【AppleID】。2在AppleID界面点击【订阅】选

微信取消订阅付款的操作步骤 微信取消订阅付款的操作步骤 Mar 26, 2024 pm 08:21 PM

1、在手机设置中点击【iTunesStore与AppStore】选项。2、点击【查看AppleID】,然后输入登录密码。3、进入【帐户设权置】界面,点击【付款信息】。4、将付款方式勾选为【无】,点击【完成】。完成后,返回微信界面,此时将会收到【解约成功通知】的信息,微信就再也不会自动扣除费用。

See all articles