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

У меня есть сервис для связи с сервером с помощью 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 ]

0 голосов
/ 25 декабря 2018

Поскольку я правильно понимаю ваш сценарий, это решение, которое вам нужно:

Пожалуйста, лучше вызовите тот метод, который вы хотите getMyData или что-то конкретное вместо для подписки, вы можете позвонить на подпискуНаблюдаемая, которая возвращается после того, как 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() -ед

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

this.someService
  .getMyData('some registration name')
  .subscribe((x) => console.log(x));
0 голосов
/ 24 декабря 2018

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

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)
...