【问题标题】:Why does socket.io-client not connect inside of an RXJS subscription?为什么 socket.io-client 不能在 RXJS 订阅内连接?
【发布时间】:2020-03-28 20:52:44
【问题描述】:

我正在尝试在 rxjs 可观察对象中接收到某个事件后启动 socket.io 连接。如果 socket.io 连接在订阅之外,则在 startEventStream 内可以正常启动,但是当放置在订阅中时,即使事件正在触发,也永远不会调用套接字内的回调。

function startEventStream(
  stateLoaded$: Observable<LoginEvent>
): Observable<AoEvent> {
  const socket = require('socket.io-client')('http://localhost:8003')
  const ret = new Subject<AoEvent>()
  const merged = merge(stateLoaded$, ret)

  const session = '895e17a0-6c2b-11ea-8d86-45f581e4b250'
  const token =
    'f3ccdd81c2ece391891cba4f7d4eb8466d3d44675dd70f11e21190ae13dfdf69'
  merged.subscribe({
    next(val) {
      process.nextTick(() => {
        if (val.type == 'state-loaded') {
          console.log('we should be connecting')  // this prints
          socket.on('connect', function() {
            console.log('connected') // this doesn't print
            ret.next({ type: 'socket-connected' })
            socket.emit('authentication', {
              session,
              token
            })
          })
        }
      })
    }
  })
  return ret
}

【问题讨论】:

  • 您可能希望根据this gist 查看更多基于套接字的流的 RxJs-ish 实现。详细说明可参见this article

标签: javascript typescript sockets socket.io rxjs


【解决方案1】:

我通过将{ autoconnect: false } 传递到套接字的初始化并在订阅内部执行socket.on() 来使其工作。我认为在调用订阅函数之前连接事件已被丢弃,因此回调从未触发。在内部启动连接即可​​解决问题。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多