Как я могу выбрать, какие подписанные наблюдатели будут отправлены?

У меня есть сервис для связи с сервером с помощью SignalR. Потребители сервиса подписываются на Subject Rxjs, но я хочу, чтобы они передавали некоторые дополнительные данные (в данном случае строку), и после того, как сервис получил данные от сервера, он мог выбрать, какого подписчика следует выполнить, вызвав метод next().

Я пытался написать новый метод подписки и хранить каждую подписку, но нет способа связать подписки и наблюдателя. Вот мой код:

private subscriptions = new Array<{registerationName:string,subscription:Subscription}>();
private receiver = new Subject(); 

public subscribe(registerationName:string ,next?: (value: {}) => void, error?: (error: any) => void): Subscription
{
     var s = this.receiver.subscribe(next,error);
     this.subscriptions.push({registerationName:registerationName,subscription:s});
     return s;
}

Очевидно, что вышеупомянутый подход не работает. Что именно я хочу сделать, это что-то вроде этого:

this.receiver.observer.where(p=>p.registerationName==stringFromServer).next({...}) 

2 ответа

Решение

Как я правильно понимаю ваш сценарий, это решение, которое вы хотите:

Пожалуйста, лучше назовите тот метод, который вы хотите getMyData или что-то конкретное вместо подписки, вы можете позвонить подписаться на Observable, который возвращается после getMyData() называется

private receiver = new Subject();

public getMyData<T>(registerationName: string): Observable<T> {
  return this.receiver.pipe(
    filter(
      ({ stringFromServer, data }) => stringFromServer === registerationName,
    ),
    map(({ stringFromServer, data }) => data),
  );
}

Когда данные сервера поступают, звоните следующее:

this.receiver.next({stringFromServer, data})

Теперь, когда данные поступают и receiver Субъект получает next() все getMyData() наблюдатели с конкретными registrationName получите next() -ed

Теперь ваше использование становится следующим:

this.someService
  .getMyData('some registration name')
  .subscribe((x) => console.log(x));

Не уверен, что это то, что вы ищете

const events=new Map()
const addEvent=(event)=>{
   events.set(event,new Subject())
}

const fireEvent=(event,param)=>{
   events.get(event).next(param)
}
const getEvent=(event)=>events.get(event)

addEvent('walk')
fireEvent('walk',2)
getEvent('walk').subscribe(console.log)
Другие вопросы по тегам