我有一项使用SignalR与服务器通信的服务。服务使用者订阅了Rxjs的Subject,但我想要的是他们应该传递一些附加数据(在这种情况下为字符串),并且在服务从服务器接收到数据之后,可以通过调用next()方法选择要执行的订户。
我试图编写一种新的订阅方法并存储每个订阅,但是无法链接订阅和观察者。这是我的代码:
WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
WifiP2pManager.Channel channel = manager.initialize(this, getMainLooper(), null);
manager.createGroup(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(getApplicationContext(), "Group Created", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int i) {
Toast.makeText(getApplicationContext(), "Group Creation Failed", Toast.LENGTH_SHORT).show();
}
});
显然,以上方法无效。我正是想做的是这样的:
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;
}
答案 0 :(得分:1)
据我所知,这是您想要的解决方案:
请更好地调用您想要的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()
的{{1}}观察者将被registrationName
编辑< / p>
现在,您的用法如下:
next()
答案 1 :(得分:0)
不确定这是否是您要寻找的
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)