javascript - 为什么通过道具在父级和使用子级中初始化的套接字之间存在不一致?
问题描述
我有一个创建 socket.io 连接的客户端组件。这发生在父组件中。从父组件中,我可以成功地发出并跨多个客户端从服务器接收事件。一旦两个客户端都加入一个房间,发送和接收服务器事件的尝试就会出错。
例如:第一个客户端尝试使用其 props 中的套接字从子组件中发送 socket.io 事件,这将成功一半,因为只有发送客户端从服务器接收到事件,另一个客户端什么都没有收到。无论客户端首先尝试发送什么,都会发生这种情况,并且会一直持续到第二个客户端尝试发送。然后两个客户端都从服务器接收事件返回,从那时起一切都按预期工作。
进一步的实验表明,如果将socket.on()
侦听器(使用存储在子组件中的套接字对象在子组件中触发的事件)放置在类之外的父组件内,那么两个客户端都会在第一次按预期成功接收服务器事件.
我不确定这是否与道具的工作方式/更新方式有关。我尝试在 didComponentUpdate 函数中比较this.props.socket
with的值prevProps.socket
,但在客户端发出事件后从未调用过它。
父组件:
import stuff;
const socket = io("http://192.***.*.*:3000");
// socket.on("test", response => {
// alert("response logged from parent component.");
// });
export default class Lobby extends React.component {
constructor(props) {
super(props);
this.state = {}
}
// first sending & receiving of server events that works properly
join =() => {
socket.emit("join");
socket.on("matched", data => {
this.setState({matched: true})
}
}
// conditional rendering of child component based on this.state.matched
render() {
return this.state.matched == false ? (
<View> <Text> Not matched </Text> </View>
):(
<ChildComponent
socket={socket}/> );
}
}
子组件:
import stuff;
export default class ChildComponent extends Component {
constructor(props) {
super(props);
this.state = {}
}
onTest = () => {
alert("outgoing test alert");
this.props.socket.emit("test");
this.props.socket.on("test", () => {alert("incoming test alert")});
}
render() {
return (
<View>
<TouchableOpacity
onPress={this.onTest}/>
</View>
);
}
}
我希望两个客户端都在第一次尝试时从服务器接收事件。但是,如果客户端 1 或客户端 2 首次尝试,则只有该客户端分别接收服务器事件。但是在半失败的尝试之后,如果另一个客户端进行尝试,两个客户端都会从服务器接收。
解决方案
推荐阅读
- delphi - 如何在 FireMonkey 中获得屏幕缩放?
- hive - 使用 UNION ALL 运行时,Hive 中的 COUNT(*) 查询表现不同
- vba - 在 Excel 中运行生成的脚本时出现“变量未定义”
- python - Mixer.blend() 模块无法正确创建引用自定义用户对象的实例,该对象使用 UUID 作为 PK
- r - 泛化用于自定义函数的 for 循环
- azure - 如何删除 Azure Databricks 资源组?
- twitter-bootstrap - 我正在使用引导程序,并且容器流体中的列垂直堆叠,而不是拉伸以水平填充所有空间
- python - 生成向量的幂并以简洁的方式将其放入 numpy 的矩阵中
- android - compileLintOptionsJavaWithJavac 失败,找不到符号
- python-xarray - 在时间维度中子集 xarray 数据集或数据数组