4

消費者が 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ません。それを行う良い方法はありますか?

これは、いくつかのテストケースを含む不完全なスタックブリッツの例です

4

1 に答える 1