代理一个Observable并在回调中连接它

时间:2018-05-25 08:18:17

标签: rxjs observable subscription subject-observer

我正在尝试返回在回调中异步创建的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的替代解决方案?

如果取消订阅主题,如何确保已取消已创建的Observableunsubscribe上的Subscription)?

1 个答案:

答案 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通知。