すべての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}`);
}
}
有限でコールドなObservableは、通常、サブスクライブを解除する必要はありません。この点では、Promisesと同じように機能します。HttpClient
サービスでAngularを使用していると仮定すると、サブスクリプションを解除する必要はありません。そのような状況でのPromiseによく似ています。
まず、いくつかのことを明確にするために、Promiseの例では、Promiseをに割り当てることによってPromiseを命令的に管理していthis.dataSubscription
ます。その呼び出しが行われthis.dataSubscription.then()
た後、HTTP呼び出しの後に任意の時間Promise.resolve()
を呼び出すと、が受信され、その.then()
関数が呼び出されます。によって返された新しいPromiseは、Promise.resolve()
実行後にクリーンアップされますが、クラスが破棄されるまで、this.dataSubscription
Promiseはクリーンアップされません。
ただし、その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]
コメントを追加