【问题标题】:How can I choose which subscribed observers to be emitted?如何选择要发出的订阅观察者?
【发布时间】:2019-05-23 09:44:54
【问题描述】:

我有一项使用 SignalR 与服务器通信的服务。服务消费者订阅了 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({...}) 

【问题讨论】:

    标签: angular filter rxjs signalr subject


    【解决方案1】:

    我正确理解您的情况,这是您想要的解决方案:

    最好调用你想要的方法getMyData 或其他特定的方法而不是订阅,你可以调用 subscribe 到 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-subject 获得next()-ed 时,所有具有特定registrationNamegetMyData() 观察者将获得next()-ed

    现在您的用法如下:

    this.someService
      .getMyData('some registration name')
      .subscribe((x) => console.log(x));
    

    【讨论】:

      【解决方案2】:

      不确定这是不是你要找的东西

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多