Angular / RxJSすべてのajax呼び出しで購読を解除する必要がありますか?

ヤロスラフ・ベレメンコ

すべてのajax呼び出しで購読を解除する必要がありますか?RxJS契約によると、そうすべきです。AJAX呼び出しはストリームやイベントではないため、一度実行されると実行されます。この特定のケースでRxJSを使用する理由は何ですか?時間の経過とともに混乱します(takeUntilについては知っていますが、ここでは重要ではありません)。

public remove(data: IData): void {
  // unsubscribe from the previous possible call
  if (this.dataSubscription &&
      this.dataSubscription.unsubscribe) {
    this.dataSubscription.unsubscribe();
  }
  this.dataSubscription = this.dataService
    .delete(data.id)
    .subscribe(() => {
      this.refresh();
    });
}

public ngOnDestroy(): void {
  // unsubscribe on deletion
  if (this.dataSubscription &&
      this.dataSubscription.unsubscribe) {
    this.dataSubscription.unsubscribe();
  }
}

実行直後にきれいに見えて破壊されるという単純な約束に対する利点は何ですか?

public remove(data: IData): void {
  this.dataService
    .delete(data.id)
    .then(() => {
      this.refresh();
    });
}

これはDataServiceコードです

@Injectable()
export class DataService {
  constructor(private _httpClient: HttpClient) { }

  public delete(id: number): Observable<IModel> {
    return this._httpClient.delete<IModel>(`${this._entityApiUrl}/${id}`);
  }
}
joh04667

有限でコールドなObservableは、通常、サブスクライブを解除する必要はありません。この点では、Promisesと同じように機能します。HttpClientサービスでAngularを使用していると仮定すると、サブスクリプションを解除する必要はありません。そのような状況でのPromiseによく似ています。

まず、いくつかのことを明確にするために、Promiseの例では、Promiseをに割り当てることによってPromiseを命令的に管理していthis.dataSubscriptionます。その呼び出しが行われthis.dataSubscription.then()た後、HTTP呼び出しの後に任意の時間Promise.resolve()を呼び出すと、が受信され、その.then()関数が呼び出されます。によって返された新しいPromiseは、Promise.resolve()実行後にクリーンアップされますが、クラスが破棄されるまで、this.dataSubscriptionPromiseはクリーンアップされません。

ただし、そのPromiseをプロパティとして割り当てない方が、さらにクリーンです。

public remove(data: IData): void {
  this.dataService
    .delete(data.id)
    .then(() => {
      this.refresh();
    });
}

さらに、Promiseは、クラスの破壊ではなく、スコープの最後でクリーンアップされます。

オブザーバブル、少なくともこのような有限の「約束のような」ものは、​​ほとんど同じように機能します。Subscription返された購入.subscribe()メソッドは、プロパティとして割り当てられていないため実行されてからクリーンアップされるため、管理する必要はありません

public remove(data: IData): void {
  this.dataService
    .delete(data.id)
    .subscribe(() => {
      this.refresh();
    });
}

これは有限のObservableであり、サブスクリプションの後に完了するため、subscribe再度呼び出すと、新しいサブスクリプションが返され、Observableの関数が再度呼び出されます。

これらのサブスクリプションを不用意に管理することは確かに面倒であり、通常、物事がより良く行われる可能性があることを示しています。

RXJSのサブスクリプション管理との違いはRXJSは、信じられないほど強力なツール、方法のために有用である1になることができるということである方法よりAJAX呼び出し非同期(async)管理するよりも。数百のサブスクライバーにデータを公開するホットなObservable、多数のサブスクライバーに独自のストリームを管理するサブジェクト、放出を停止しない無限のObservable、状態を管理して他のObservableを返す高次のObservableなどがあります。この場合、サブスクライブを解除するのが最適です。練習しますが、正直なところ、極端な場合以外にパフォーマンスの問題を引き起こすことはありません。

良い比較はObservable.fromEvent()プロパティです。removeEventListener後に正しく使用することがベストプラクティスであるようにaddEventListener、このObservableから正しく購読を解除する必要があります。ただし、と同じようにremoveEventListener、常に実行されるわけではなく、通常、今日のプラットフォームで問題が発生することはありません。

また、述べられた「RxJS契約」に関連して:これは同じドキュメントからの抜粋です:

When an Observable issues an OnError or OnComplete notification to its observers, this ends the subscription. Observers do not need to issue an Unsubscribe notification to end subscriptions that are ended by the Observable in this way.

Finite Observablesは、放出後に完了し、購読を解除する必要はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Angularのhttp呼び出しの購読を解除する必要がありますか?

分類Dev

Angular 2 / Rxjs:本当に購読を解除する必要がありますか?

分類Dev

Angular:switchMapの購読を解除する必要があります

分類Dev

すべてのRESTfulAPI呼び出しをAngularサービスで定義する必要がありますか?

分類Dev

Angularのpipe()の購読を解除する必要がありますか?

分類Dev

Angular4-setTimeout呼び出しのサブスクライブを解除する必要がありますか?

分類Dev

AngularでngOnInit()を再度呼び出す必要がありますか?

分類Dev

Angular subscribe to updateメソッド、いつ購読を解除する必要がありますか

分類Dev

Angular1.4で$ digestを手動で呼び出す必要がありますか?

分類Dev

ルートAngularコンポーネントのオブザーバブルの購読を解除する必要がありますか?

分類Dev

Angular Formの変更を解除する必要がありますか?

分類Dev

Angular- $ http呼び出しごとにpromiseを使用する必要がありますか?

分類Dev

すべての非同期http呼び出しが完了するまで読み込みインジケーターを表示する方法-Angular

分類Dev

ネストされたサブスクライブであり、すべての値を本体としてAPIに渡す必要があります-Angular 6 RxJS

分類Dev

Angularでは、* ngForループから関数を呼び出していますが、ループ全体が2回実行されますが、1回だけ実行する必要があります

分類Dev

すべての外部サービスをAngularでモックする必要がありますか?

分類Dev

Angularコンポーネントはサービスを呼び出すサービスを呼び出します:両方とも結果で何かをする必要があります

分類Dev

Androidで1回の呼び出しですべての解析チャネルの購読を解除する方法はありますか?

分類Dev

Angularですべてのhttp呼び出しの前に条件を確認することは可能ですか?

分類Dev

API呼び出しからサービスを介してコンポーネントに返されるデータはオブジェクトであり、Angularの配列である必要があるようです

分類Dev

2つのAPI呼び出しを必要とするAngular / rxjsにオブジェクトをロードするにはどうすればよいですか?

分類Dev

特定の応答が与えられたときにAngular2メソッドの購読を解除しますか?

分類Dev

Angular HttpClient:最初のAPI呼び出しが終了するまでさらにAPI呼び出しを行います

分類Dev

すべてのAngular2HTTP呼び出しがいつ終了したかを知る方法

分類Dev

RxJS / Angular6で相互に依存している異なるHTTP呼び出しをマージします

分類Dev

カスタムサービスをAngularで呼び出す-呼び出し元が見つかりません

分類Dev

カスタムサービスをAngularで呼び出す-呼び出し元が見つかりません

分類Dev

angular.js $ destroyイベント-手動でバインドを解除する必要がありますか?

分類Dev

購読解除を取得し、angular2またはtypescriptを使用してトグルボタンで単語を購読する方法

Related 関連記事

  1. 1

    Angularのhttp呼び出しの購読を解除する必要がありますか?

  2. 2

    Angular 2 / Rxjs:本当に購読を解除する必要がありますか?

  3. 3

    Angular:switchMapの購読を解除する必要があります

  4. 4

    すべてのRESTfulAPI呼び出しをAngularサービスで定義する必要がありますか?

  5. 5

    Angularのpipe()の購読を解除する必要がありますか?

  6. 6

    Angular4-setTimeout呼び出しのサブスクライブを解除する必要がありますか?

  7. 7

    AngularでngOnInit()を再度呼び出す必要がありますか?

  8. 8

    Angular subscribe to updateメソッド、いつ購読を解除する必要がありますか

  9. 9

    Angular1.4で$ digestを手動で呼び出す必要がありますか?

  10. 10

    ルートAngularコンポーネントのオブザーバブルの購読を解除する必要がありますか?

  11. 11

    Angular Formの変更を解除する必要がありますか?

  12. 12

    Angular- $ http呼び出しごとにpromiseを使用する必要がありますか?

  13. 13

    すべての非同期http呼び出しが完了するまで読み込みインジケーターを表示する方法-Angular

  14. 14

    ネストされたサブスクライブであり、すべての値を本体としてAPIに渡す必要があります-Angular 6 RxJS

  15. 15

    Angularでは、* ngForループから関数を呼び出していますが、ループ全体が2回実行されますが、1回だけ実行する必要があります

  16. 16

    すべての外部サービスをAngularでモックする必要がありますか?

  17. 17

    Angularコンポーネントはサービスを呼び出すサービスを呼び出します:両方とも結果で何かをする必要があります

  18. 18

    Androidで1回の呼び出しですべての解析チャネルの購読を解除する方法はありますか?

  19. 19

    Angularですべてのhttp呼び出しの前に条件を確認することは可能ですか?

  20. 20

    API呼び出しからサービスを介してコンポーネントに返されるデータはオブジェクトであり、Angularの配列である必要があるようです

  21. 21

    2つのAPI呼び出しを必要とするAngular / rxjsにオブジェクトをロードするにはどうすればよいですか?

  22. 22

    特定の応答が与えられたときにAngular2メソッドの購読を解除しますか?

  23. 23

    Angular HttpClient:最初のAPI呼び出しが終了するまでさらにAPI呼び出しを行います

  24. 24

    すべてのAngular2HTTP呼び出しがいつ終了したかを知る方法

  25. 25

    RxJS / Angular6で相互に依存している異なるHTTP呼び出しをマージします

  26. 26

    カスタムサービスをAngularで呼び出す-呼び出し元が見つかりません

  27. 27

    カスタムサービスをAngularで呼び出す-呼び出し元が見つかりません

  28. 28

    angular.js $ destroyイベント-手動でバインドを解除する必要がありますか?

  29. 29

    購読解除を取得し、angular2またはtypescriptを使用してトグルボタンで単語を購読する方法

ホットタグ

アーカイブ