我正在尝试返回在回调中异步创建的Observable
:
const mkAsync = (observer, delay) =>
setTimeout(() => Observable.of('some result').subscribe(observer), delay)
const create = arg => {
const ret = new Subject()
mkAsync(ret, arg)
return ret
}
因此,我使用Subject
作为单播代理,该代理订阅了回调中的基础Observable
。
我对此解决方案的问题是,当我取消订阅Subject
的子订阅时,取消订阅不会转发到基础Observable
。看起来我需要某种类型的引用计数,以便在没有更多订阅者的情况下使Subject
取消订阅,但在使用这种强制回调样式时我无法弄明白。
我必须保持mkAsync
无效并且正在寻找替代实现。
这是正确的方法吗?是否有使用Subject
的替代解决方案?
如果取消订阅主题,如何确保已取消已创建的Observable
(unsubscribe
上的Subscription
)?
答案 0 :(得分:0)
这是一个相当广泛的问题,很难说你想用这个来实现什么。我有两个想法:
第一件事是refCount()
运算符只存在于ConnectableObservable
类,而multicast
(或publish
)根据您传递的参数返回。有关详细信息,请参阅实施(基本上如果您未设置任何selector
功能):https://github.com/ReactiveX/rxjs/blob/5.5.11/src/operators/multicast.ts
我能想到的第二个问题是你基本上是这样做的:
const ret = new Subject()
Observable.of(...).subscribe(ret);
问题是.of
会立即发出next
项,然后发送complete
通知。主题具有内部状态,当Subject
收到complete
通知时,它会将自己标记为stopped
,它将永远不会发出任何内容。
我怀疑你发生了什么。即使您使用return ret
返回主题实例,之后可能订阅它,您仍然无法收到任何内容,因为此主题已收到complete
通知。