Почему socket.io-клиент не подключается внутри подписки RX JS? - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь установить соединение socket.io при получении определенного события в наблюдаемой rx js. Соединение с 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
}

1 Ответ

0 голосов
/ 29 марта 2020

Я получил его, передав { autoconnect: false } в инициализацию сокета и выполнив socket.on() внутри подписки. Я думаю, что событие connect было отброшено до того, как была вызвана функция подписки, поэтому обратный вызов никогда не запускался. Начало соединения внутри решает проблему.

...