javascript - 为什么 socket.io-client 不能在 RXJS 订阅中连接?
问题描述
我正在尝试在 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
}
解决方案
我通过传入{ autoconnect: false }
套接字的初始化并socket.on()
在订阅内部进行操作来使其工作。我认为在调用订阅函数之前连接事件已被丢弃,因此回调从未触发。在内部启动连接可以解决问题。
推荐阅读
- pip - 使用 pip 降级或安装早期版本的软件包
- c++ - 为什么即使我放了一个 break 语句,我的程序也会一直循环
- javascript - 设备显示未定义
- laravel - 如何在 laravel Eloquent 中忽略大小写和空格
- r - 功能...故障(malcoder!),包括group_by和export
- android - 此 Android 代码按什么顺序运行?
- python-3.x - 在几秒钟内获得大量数字以达到平均值、最大值和最小值时,如何转换为日期时间格式?
- express - 使用 express 设置服务器
- tensorflow - Bert 模型出现 InvalidArgumentError Condition x <= y did not hold element wise
- python - “HTTP 错误 401:未经授权”无法使用 Deta Base