如何选择要发出哪些订阅的观察者?

时间:2018-12-24 06:19:09

标签: angular filter rxjs signalr subject

我有一项使用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;
}

2 个答案:

答案 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)