我如何选择要发射的订阅观察者?
How can I choose which subscribed observers to be emitted?
我有一项使用 SignalR 与服务器通信的服务。服务消费者订阅 Rxjs 的主题,但我想要的是他们应该传递一些额外的数据(在这种情况下是一个字符串),并且在服务从服务器接收到数据后可以通过调用 next() 方法选择要执行的订阅者。
我尝试编写一个新的订阅方法并存储每个订阅,但无法 link 订阅和观察者。这是我的代码:
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({...})
不确定这是否是您要找的
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)
据我正确理解您的情况,这就是您想要的解决方案:
拜托,最好调用你想要的方法 getMyData
或一些特定的方法来代替 订阅,你可以调用订阅 Observable 的 returns 在 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()
-ed 时,所有具有特定 registrationName
的 getMyData()
观察者将得到 next()
-编
现在您的用法如下:
this.someService
.getMyData('some registration name')
.subscribe((x) => console.log(x));
我有一项使用 SignalR 与服务器通信的服务。服务消费者订阅 Rxjs 的主题,但我想要的是他们应该传递一些额外的数据(在这种情况下是一个字符串),并且在服务从服务器接收到数据后可以通过调用 next() 方法选择要执行的订阅者。
我尝试编写一个新的订阅方法并存储每个订阅,但无法 link 订阅和观察者。这是我的代码:
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({...})
不确定这是否是您要找的
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)
据我正确理解您的情况,这就是您想要的解决方案:
拜托,最好调用你想要的方法 getMyData
或一些特定的方法来代替 订阅,你可以调用订阅 Observable 的 returns 在 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()
-ed 时,所有具有特定 registrationName
的 getMyData()
观察者将得到 next()
-编
现在您的用法如下:
this.someService
.getMyData('some registration name')
.subscribe((x) => console.log(x));