websocket推送的逻辑问题?

image.png

// 伪代码
<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.5k
1 个回答
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这里赋值之前先判断一下是否相等,如果相等就不要重新赋值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题