Socket.io存储Socket对象延迟发送消息失败问题求助
问题分析与解决方案
嘿,这个问题我一眼就看出来了——你踩了变量作用域覆盖的坑!
你看,在connection回调里拿到的socket是真实的客户端连接实例,所以直接调用socket.emit没问题。但在init事件的回调函数里,你把参数名也设成了socket,这就把外层作用域里的那个有效Socket对象给覆盖了!此时回调里的socket其实是客户端发送init事件时传过来的数据(不是Socket实例),你调用它的emit自然不会有任何效果。
修正后的代码
只需要把init回调的参数名改成别的,避免和外层的socket重名就行:
io.on('connection', (socket): void => { socket.emit('hello', { text: "hello" }); // 正常工作 socket.on('init', (initData): void => { // 这里用外层的socket对象来发消息 socket.emit('hello', { text: "hello" }); // 现在可以正常工作了 // 如果需要处理客户端传来的init数据,就用initData变量 }) })
小提示
嵌套回调里一定要注意变量名的冲突,这种作用域覆盖的问题很隐蔽,尤其是在多人协作或者写复杂逻辑的时候,尽量给参数起语义化的名字(比如initData、clientPayload),既能避免冲突,也能让代码更易读。
内容的提问来源于stack exchange,提问作者Shorty
相关产品推荐
相关产品推荐

