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来避免错过任何活动,但现在我立即订阅了该主题。