Rxjs 检索可观察订阅者并使他们订阅另一个可观察订阅者 简而言之

Rxjs 检索可观察订阅者并使他们订阅另一个可观察订阅者 简而言之,rxjs,rxjs-observables,Rxjs,Rxjs Observables,给定一个现有的可观察对象(尚未完成),是否有方法检索关联的订阅者(传递给subscribe的函数)以使它们订阅另一个可观察对象 上下文 我的应用程序中的一个服务有助于创建SeverEvent连接,将ConnectableObservable返回到代理连接,并允许使用publish操作符进行多播。该服务通过内部存储跟踪现有连接: store:{[key:string]:ConnectionTracker}; // … 接口连接记录器{ url:string; eventSource:eventSo

给定一个现有的可观察对象(尚未完成),是否有方法检索关联的订阅者(传递给subscribe的函数)以使它们订阅另一个可观察对象

上下文 我的应用程序中的一个服务有助于创建SeverEvent连接,将ConnectableObservable返回到代理连接,并允许使用publish操作符进行多播。该服务通过内部存储跟踪现有连接:

store:{[key:string]:ConnectionTracker};
// …
接口连接记录器{
url:string;
eventSource:eventSource;
可观察:rx.可连接可观察;
订阅:rx.subscription;
观察者:rx.observer;
数据?:任意;//任意数据
}
在创建连接时,如果关联的跟踪器已经存在(使用连接的端点进行标识),则服务应:

  • 确定关闭现有跟踪器的ServerEvent连接
  • ok打开一个新的SerevrEvent连接(因此是一个新的ConnectableObservable)
  • 将现有跟踪器的Observable替换为新的Observable,但让现有订户现在订阅新的Observable
下面是创建ConnectionTracker的代码部分

/**
*创建/更新服务器事件连接跟踪器
*/
createTracker(端点:string,queryString:string=null):ConnectionTracker
{
让fullUri=endpoint+(queryString?`?${queryString}`:'')
,tracker=this.findTrackerByEndpoint(端点)|{
可观察:空,
fullUri:fullUri,
eventSource:null,
观察员:空,
订阅:空
}
;
//追踪器存在
如果(tracker.observable!==null){
//如果fullUri没有更改,请按原样使用跟踪器
如果(tracker.fullUri===fullUri){
返回跟踪器;
}
//在这一点上,我们知道“fullUri”已经改变,跟踪器的
//应更换新的接头
// ⇒ 待办事项
// ⇒ 收集旧跟踪器。observable的订阅者/订阅进行
//他们订阅新的可观察对象(如下所示)
//终止以前的连接并清理相关资源
tracker.observer.complete();
tracker.eventSource.close();
}
tracker.eventSource=neweventsource(fullUri,{withCredentials:true});
tracker.observable=rx.observable.create((观察者:rx.observable)=>{
//执行一次
tracker.eventSource.onmessage=e=>observer.next(JSON.parse(e.data));
tracker.eventSource.onerror=e=>observer.error(e);
//跟踪观察者
tracker.observer=观察者;
})
//将Observable转换为多播的可连接Observable
.publish()
;
//立即开始发射,并保留对
//代理认购供日后处置
tracker.subscription=tracker.observable.connect();
返回跟踪器;
}

谢谢。

不要试图手动将订户从一个可观察对象转移到另一个可观察对象,您应该为听众提供一个可观察对象,在需要时自动切换到另一个可观察对象

通过使用高阶可观察对象(发出可观察对象的可观察对象)来实现,该对象总是切换到最近的内部可观察对象

基本概念
//使用BehaviorSubject,以便后期订阅者也可以立即获得最新的内部可观察内容
const higherOrderObservable=新行为主体(空);
//将新的可观察对象传递给侦听器
下一步(新的可观测(..);
//获取最新的内部可观测值
const currentObservable=higherOrderObservable.pipe(开关映射(obs=>obs));
currentObservable.subscribe(valueFromInnerObservable=>{..})
就你而言 为每个端点创建一个
行为子对象
(跟踪器供应商),该对象发出当前应用于该端点的可观察(跟踪器)。当应该为给定端点使用不同的跟踪器时,将此新的可观察对象传递给
行为主体
。让您的听众订阅自动为他们提供正确跟踪器的
行为主题
(跟踪器供应商),即切换到当前应使用的可观察对象

代码的简化版本可能如下所示。具体细节取决于您在整个应用程序中如何使用函数
createTracker

接口连接记录器{
fullUri:字符串;
跟踪器$:可连接可观察;
}
//将端点映射到跟踪程序供应商。
//这是你的高阶可见光,因为它发射包裹可见光的物体
存储:{[key:string]:BehaviorSubject};
closeAllTrackers$=新主题();
//如有必要,创建一个新的跟踪器,并返回该跟踪器的ConnectedObservable。
//ConnectedObservable始终类似于当前跟踪器。
createTracker(端点:string,queryString:string=null):可观察{
const fullUri=endpoint+(queryString?`${queryString}`:'';
//如果端点不存在跟踪器供应商,请创建一个跟踪器供应商
如果(!存储[端点]){
store[endpoint]=新的BehaviorSubject(null);
}
const currentTracker=store[endpoint].getValue();
//如果不存在跟踪器或当前跟踪器已过时,请创建一个新跟踪器
如果(!currentTracker | | currentTracker.fullUri!==fullUri){
const tracker$=新的可观察对象(订户=>{
const source=new EventSource(fullUri,{withCredentials:true});
source.onmessage=e=>subscriber.next(JSON.parse(e.data));
source.onerror=e=>subscriber.error(e);
return()=>source.close();//取消订阅时关闭源
}).管道(publish())为可连接可观察;
tracker$.connect();
//过关
  private observables: Subject<Observable<Data>> = new Subject();

  getData(): Observable<Data> {
    return this.observables.pipe(switchAll());
  }

  onMakingNewRequest(newObservable: Observable<Data>) {
    this.observables.push(newObservable);
  }