javascript - 使用共享的 RxJS observable 重新连接 WebSocket

标签 javascript websocket rxjs

我有一个像这样的可观察对象:

const records$ =
    Rx.DOM.fromWebSocket('ws://192.168.2.4:9001/feed/', null)
    .map(ev => parseRecord(ev.data))
    .share();

我有很多订阅者。当连接丢失时,所有订阅者取消订阅:

let records$Subscription;
records$Subscription = records$.subscribe(
    record => { ... },
    error => records$Subscription.dispose()
);

我验证了对 dispose 的调用确实是针对每个订阅进行一次。因此,share 引用计数已达到零。

但是,当我现在再次订阅 records$ 时,没有建立新的 WebSocket 连接。然而,当我删除对 share 的调用时,它。为什么 share 无法按预期工作?

最佳答案

我相信在 rxjs v5 中,share 确实允许您重新连接,但在 Rxjs v4 中则不允许。

在 Rxjs 4 中,share 基本上是 multicast.refCount 并且一旦用于多播的主题完成,它就不能被重用(根据 Rxjs 语法规则,有一个也看看What are the semantics of different RxJS subjects?),导致您观察到的行为。

在 Rxjs 5 中,它使用主题工厂(类似于 multicast(() => new Rx.Suject().refCount())),因此在必要时会重新创建主题。

查看问题 herehere了解更多详情。

简而言之,如果您无法满足当前的行为,您可以切换到 v5(请注意,它仍处于测试阶段,并且存在一些重大更改)。

关于javascript - 使用共享的 RxJS observable 重新连接 WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675104/

相关文章:

javascript - 如何在弹出的警报中添加声音?

javascript - 浏览器未加载 Alfresco 表单字段验证 Javascript

ios - 无法连接托管在 Socket.IO 上的 WebSocket API

ruby - Redis Pub/Sub 导致 web socket 连接挂起

javascript - Rxjs 将 subject 与 refCount 结合使用

angular - BaseRouterStoreState 缺少类型 'ActionReducerMap<State, Action>' 的属性

php - 使用 anchor 指定链接加载位置

javascript - 谷歌浏览器 Javascript 链接错误

python - django wsgi错误没有找到名为站点名称的模块

angular - 如何链接需要多个先前可观察值的依赖订阅