Javascript Ajax轮询聊天在speedy chat的消息接收器前端获得重复

Javascript Ajax轮询聊天在speedy chat的消息接收器前端获得重复,javascript,ajax,setinterval,long-polling,session-storage,Javascript,Ajax,Setinterval,Long Polling,Session Storage,我开发了一个javascript聊天(后端是php),使用: 1)长轮询以获取接收方的新消息 2) 用于存储消息计数器的会话存储 3) setInterval读取新消息,如果SessionStorage Counter

我开发了一个javascript聊天(后端是php),使用:

1)长轮询以获取接收方的新消息
2) 用于存储消息计数器的会话存储
3) setInterval读取新消息,如果SessionStorage Counter
该模块工作正常,但当用户进行快速聊天时,接收器前端会收到两到三条相同的消息(计数器不会失败,查询也不会提供双重插入)

代码似乎是正确的(这就是为什么我不提供代码),所以间隔延迟可能是原因(在减少间隔延迟时,没有任何变化)


您认为上述模式是一种不好的做法吗?您认为哪种模式可以消除错误?

如果我自己解决(而不是使用已经处理此问题的现有库),我的方法是:

  • 让服务器在每封邮件到达时为其分配一个唯一的ID(GUID)
  • 在客户端上,存储最近接收的消息的ID
  • 轮询新消息时,请使用成功接收的最后一条消息的ID进行轮询。然后,服务器通过在自己的队列中找到该消息并重播所有后续消息来响应
  • 为了防止“丢弃”消息,每条消息还可以携带上一条消息的ID(允许客户端进行一致性检查)

如果重新填充确实会导致从服务器向客户机传递重复项,那么在每条消息上都存在唯一的ID使得消除它们变得微不足道。将服务器端消息队列视为一个事件流,每个客户端都跟踪其上次读取的位置。客户端不会猜测消息的适当顺序、数量等,因为它的状态完全由“我看到了什么”组成,很少有机会失去同步。

因为它是实时聊天,
setInterval
间隔可能足够小,可以同时向服务器请求两到三次新消息。确保服务器处理程序已同步,并且忽略来自同一用户的重复查询。

在附加新聊天消息之前,您可以始终检查DOM,以查看是否已存在相同的消息。这样你就不会有两次相同的信息了,我给你的另一个建议是,如果要在应用程序中进行实时聊天,为什么不考虑使用服务器端的socketio和后端运行节点服务器的客户端来满足聊天应用程序的需要您是否依赖服务器端的时间戳?不依赖时间戳。我依靠消息计数器获取新消息服务器端。选择选项3或问题。@Nikos也许使用微时间时间戳可以产生更准确的结果。
1) long-polling to get new messages for the receiver 
2) sessionStorage to store the counter of messages  
3) setInterval to read new messages and if sessionStorageCounter < setIntervalCounter then the last message is shown to receiver.
4) javascript to create,update and write the chat dialogues