Rxjs 代理一个可观察对象并在回调中连接它
我试图返回在回调中异步创建的Rxjs 代理一个可观察对象并在回调中连接它,rxjs,observable,subscription,subject-observer,Rxjs,Observable,Subscription,Subject Observer,我试图返回在回调中异步创建的可观察的: const mkAsync=(观察者,延迟)=> setTimeout(()=>Observable.of('some result')。订阅(observator),延迟) const create=arg=>{ const ret=新主题() mkAsync(ret,arg) 回程网 } 因此,我使用Subject作为单播代理,订阅回调中的基础可观察的 这个解决方案的问题是,当我从主题的subscribe中取消订阅时,取消订阅不会转发到基础的可观察的
可观察的:
const mkAsync=(观察者,延迟)=>
setTimeout(()=>Observable.of('some result')。订阅(observator),延迟)
const create=arg=>{
const ret=新主题()
mkAsync(ret,arg)
回程网
}
因此,我使用Subject
作为单播代理,订阅回调中的基础可观察的
这个解决方案的问题是,当我从主题
的subscribe中取消订阅时,取消订阅不会转发到基础的可观察的
。看起来我需要某种类型的refcounting,以便在没有更多订阅者时使主题
取消订阅,但在这种命令式回调样式中使用它时,我无法找到它
我必须保持mkAsync
无效,并且正在寻找替代实现
这样做对吗?使用主题
是否有其他解决方案
当主题被取消订阅时,我如何确保创建的可观察的被取消(订阅上调用取消订阅
),这是一个非常广泛的问题,很难说你想用它实现什么。我有两个想法:
第一件事是有一个refCount()
操作符,它只存在于ConnectableObservable
类上,该类是从多播
(或发布
)返回的,具体取决于您传递的参数。有关更多详细信息,请参见实现(基本上,如果您没有设置任何选择器
功能):
我能想到的第二个问题是,你基本上是这样做的:
const ret = new Subject()
Observable.of(...).subscribe(ret);
问题是,.of
会立即发出它的下一个
项目,然后发送完成
通知。受试者具有内部状态,当受试者
收到完成
通知时,它将自己标记为已停止
,它将永远不会发出任何东西
我怀疑你就是这样。即使您使用return ret
返回主题实例,并且以后可能会订阅它,您仍然不会收到任何内容,因为此主题已经收到complete
通知。似乎refCount
为我提供了一个新的可观察对象,但我已经返回了主题。目前的方法基本上是有效的,对于退订问题是安全的。我可以使用ReplaySubject来避免错过任何活动,但现在我立即订阅了该主题。