消費者が ID に基づいてさまざまな値を観察できるようにする角度サービスを実装しています。
その本質は次のようになります。
private subjects = new Map<number, Subject<any>>();
public subscribe(id: number, observer: any): Subscription {
// try getting subject for this id (or undefined if it does not yet exist)
let subj = this.subjects.get(id);
// create subject if it does not yet exist
if (!subj) {
subj = new Subject<any>();
this.subjects.set(id, subj);
}
// subscribe observer
const subscription = subj.subscribe(observer);
// set up teardown logic (gets called when subscription is unsubscribed)
subscription.add(() => {
// remove subject from the map, if this was the last subscription
if (subj.observers.length == 0) {
this.subjects.delete(id);
}
});
// return subscription
return subscription;
}
上記は正常に動作しますが、API を使用するのは少し面倒です (コンシューマーでは、すべてのサブスクリプションを手動で追跡し、適切にサブスクリプションを解除する必要があります)。
Observable
次のようなを返すメソッドが必要です。
public subscribe(id: number): Observable<any> {
// TODO: Return an observable for this id and make sure that
// its corresponding subject is in the map iff at least one of the observables
// for this id has at least one subscription.
return ...;
}
これにより、必要な値をパイプを使用してコンポーネント テンプレートから直接サブスクライブできるためasync
、Angular がオブザーバーのサブスクライブ解除を処理します。
Subject
しかし、使用されなくなったs から未使用の s を削除するロジックを実装する方法がよくわかりMap
ません。それを行う良い方法はありますか?