websocket推送的逻辑问题?

作者站长头像
站长
· 阅读数 15

websocket推送的逻辑问题?

// 伪代码
<textarea v-model="text" @change="onChange"></textarea>

const text = ref('')

const onChange = (val) => {
  socket.emit('send', text.value); // 如果值变化就通过websocket发送给node端
}
socket.on('getMsg', (data: any) => {
  // 如果收到node端推送的就赋值给text,但是这样就会导致又处触发上面的watch,发送给node,node又推给这里,这里赋值又触发watch就死循环了
  // text.value = data
  console.log("服务端消息:", data);
});

请问我要实现相互推送代码思路应该是什么样的?

回复
1个回答
avatar
test
2024-07-16
socket.emit('send', text.value);

这里虽然是通过socket发送数据,但是你在发送的时候,还是需要将这个过程模拟成普通的发送请求的模式。例如:做一个简单的抽象,send的时候不直接发送text.value,而是发送一个

{
  "body": text.value,
  "request_id": <request_id>,  // 这里的request_id可以使用时间戳之类的。
  "user_id": <user_id>,  // 这里可以是用户,或者两个不同设备
}

抽象成这样之后,你在接收到消息的时候,就能通过简单的判断是不是自己发出去同步给对方的,还是接收到对方同步过来的消息。这样就能避免自己接收到自己发送出去的消息的问题。

当然,其实还有一个更简单直接的办法就是,text.value = data这里赋值之前先判断一下是否相等,如果相等就不要重新赋值

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容