ホームページ ウェブフロントエンド jsチュートリアル Angular でサブスクリプションをキャンセルするタイミングの詳細な説明

Angular でサブスクリプションをキャンセルするタイミングの詳細な説明

Dec 12, 2017 am 11:05 AM
angular キャンセル サブスクリプション

Observable オブジェクトをサブスクライブするとき、またはイベント リスナーをセットアップするとき、ある時点でサブスクリプション解除操作を実行してオペレーティング システムのメモリを解放する必要があることはご存知かもしれません。そうしないと、アプリケーションでメモリ リークが発生する可能性があります。

ngOnDestroy ライフサイクル フックでサブスクリプション解除操作を手動で実行する必要がある一般的なシナリオをいくつか見てみましょう。この記事では主に、Angular でサブスクリプションをキャンセルするタイミングについての簡単な議論を紹介します。これが非常に優れていると思いますので、参考にしてください。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

手動リリースリソースシナリオ

Form


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() {
  // 手动执行取消订阅的操作
 }
}
ログイン後にコピー


レンダラサービス


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()またはfromEvenを使用する場合t() 演算子を使用すると、無限の 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;);
 }
}
ログイン後にコピー


コンポーネントが破棄、非同期 パイプラインは、メモリ リークのリスクを回避するために、サブスクリプション解除操作を自動的に実行します。

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 サービスまたはタイマー 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);
 }
}
ログイン後にコピー


タイマーオペレーター

オペレーター署名


コードをコピーしますコードは次のとおりです:


public static timer(initialDelay:number | Date, period:number) 、スケジューラー: Scheduler ): Observable


Operator function

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));
ログイン後にコピー


最後の提案

Subscribe() メソッドの呼び出しはできるだけ少なくする必要があります。Subject について詳しくは、「RxJS: Don't Unsubscribe」の記事をご覧ください。

具体的な例は次のとおりです:


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>
ログイン後にコピー


オペレータ関数

E mit source Observable ノーティファイア 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));
ログイン後にコピー


関連する推奨事項:

AngularJS でのフォーム検証の詳細な説明

AngularJS_Angular でのカスタム ディレクティブの使用の詳細な説明JS

AngularJSの詳しい説明filters_AngularJS を定義する

以上がAngular でサブスクリプションをキャンセルするタイミングの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Win11でウィンドウオーバーレイとカスケード効果をキャンセルする方法 Win11でウィンドウオーバーレイとカスケード効果をキャンセルする方法 Jan 10, 2024 pm 02:50 PM

win11のデフォルトのウィンドウの重なりは非常に煩わしいので、多くの友人がウィンドウの重なりを解除したいのですが、解除方法がわかりません。実際には、関連するソフトウェアを使用するだけで済みます。 win11でウィンドウの重なりを解除する方法 方法1:タスクバーから解除する 1.Win11には独自の解除機能がないため、「startallback」をダウンロードする必要があります 2.ダウンロードが完了したら、圧縮パッケージを「解凍」します。解凍が完了したら、フォルダーを開いて、図示のインストール プログラムを実行してインストールを完了します。 。 3. インストールが完了したら、「コントロール パネル」を開き、右上隅の「表示方法」を「大きなアイコン」に変更する必要があります。 4. このようにして、「startallback」を見つけてクリックして開き、左側の「タスク」を入力します

win11の画面ロックを解除するチュートリアル win11の画面ロックを解除するチュートリアル Dec 31, 2023 pm 12:29 PM

画面コンテンツを保護したり、電力を節約したりするために、スクリーン セーバーをオンにすることがよくありますが、スクリーン セーバーを終了した後、毎回パスワード ロックを再入力するのは非常に面倒です。 、スクリーンセーバーの設定でオフにすることができます。 Win11 の画面ロックを解除する方法: 1. まず、デスクトップの空白スペースを右クリックし、「個人用設定」を開きます。 2. 次に、右側にある「ロック画面インターフェイス」を見つけて開きます。 3. 次に、「スクリーン セーバー」を開きます。 4. 最後に、「復元時にログイン画面を表示する」にチェックを入れ、保存を確認して画面ロックを解除します。

Meituanでの注文をキャンセルする方法 Meituanでの注文をキャンセルする方法 Mar 07, 2024 pm 05:58 PM

Meituan を使用して注文する場合、ユーザーは希望しない注文をキャンセルすることができます。多くのユーザーは Meituan の注文をキャンセルする方法がわかりません。ユーザーは、マイ ページをクリックして受け取りたい注文を入力し、受け取りが必要な注文を選択します。キャンセルする場合は、「キャンセル」をクリックします。 Meituanの注文をキャンセルする方法 1. まず、Meituanのマイページをクリックして、受け取る注文を入力します。 2. 次に、キャンセルする必要がある注文をクリックして入力します。 3. 「注文をキャンセル」をクリックします。 4. [OK] をクリックして注文をキャンセルします。 5. 最後に、個人の状況に応じてキャンセルの理由を選択し、[送信] をクリックします。

Mango TVの自動更新はどこでキャンセルできますか? Mango TVの自動更新はどこでキャンセルできますか? Feb 28, 2024 pm 10:16 PM

多くのユーザーは、ビデオ ソフトウェアである Mango TV を体験すると、より多くの映画やテレビのリソース、より包括的なサービスを楽しむためにメンバーになることを選択します。 Mango TV メンバーシップ サービスを使用する過程で、ユーザーの中には、エキサイティングなコンテンツを見逃さないように割引を享受するために自動更新機能をオンにすることを選択する人もいます。ただし、ユーザーが会員サービスが必要なくなった場合や、支払い方法を変更したい場合、財産の安全を守るために、自動更新機能を解除することは非常に重要なことです。詳細については、この記事をフォローしてください。 Mango TVの会員自動更新をキャンセルするにはどうすればよいですか? 1. まず、Mango TV モバイル APP に [My] と入力し、[VIP メンバーシップ] を選択します。 2. 次に [チューブ] を見つけます。

WeChat で耳マークをキャンセルする詳細な手順 WeChat で耳マークをキャンセルする詳細な手順 Mar 25, 2024 pm 05:01 PM

1. 耳のマークは音声受信モードです まず、WeChat を開きます。 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 コードを実行できます。ウブにいるために

WeChatでの購読料の支払いをキャンセルするための操作手順 WeChatでの購読料の支払いをキャンセルするための操作手順 Mar 26, 2024 pm 08:21 PM

1. 電話機の設定で [iTunesStore と AppStore] オプションをクリックします。 2. [AppleIDを表示]をクリックし、ログインパスワードを入力します。 3. [アカウント設定]インターフェイスに入り、[支払い情報]をクリックします。 4. 支払い方法を[なし]にチェックし、[完了]をクリックします。完了後、WeChat インターフェースに戻ると、[キャンセル成功の通知] メッセージが表示され、WeChat での料金の自動引き落としは行われなくなります。

iQiyiの自動更新をキャンセルする方法 iQiyiの自動更新をキャンセルする方法 iQiyiの自動更新をキャンセルする方法 iQiyiの自動更新をキャンセルする方法 Feb 22, 2024 pm 04:46 PM

My Gold VIP会員インターフェースで管理自動更新機能を開いてキャンセルすることができます。チュートリアル 該当モデル: Huawei P50 システム: HarmonyOS2.0 バージョン: iQiyi 12.1.0 分析 1 携帯電話で iQiyi アプリを開き、マイページに入ります。 2 次に、ページの上部にある [ゴールド VIP メンバーシップ] をクリックし、[自動更新オプションの管理] をクリックします。 3. ポップアップ ウィンドウで [自動更新をキャンセル] をクリックします。興味がない場合は、キャンセルを続けてください。 4最後に自動更新をオフにすることを確認し、「理解しました。残酷に拒否するだけです」をクリックします。補足: Apple 携帯電話で iQiyi の自動更新機能をキャンセルする方法 1. 携帯電話の設定を開き、設定インターフェースの上部にある [AppleID] をクリックします。 2AppleIDインターフェースの[購読]をクリックして選択します

See all articles