Как я могу выбрать, какие подписанные наблюдатели будут отправлены?
У меня есть сервис для связи с сервером с помощью 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)