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个回答

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
这里赋值之前先判断一下是否相等,如果相等就不要重新赋值
回复

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