潜在问题(一般):
用户 A 输入一条聊天消息(使用浏览器/客户端 A),该消息立即添加到他的视图中,并且它也被发送到服务器。服务器将其发送给用户/客户端 B 以更新他的视图。但与此同时,用户 B 输入了一条聊天消息,它会立即添加到他的视图中 - 现在消息 B 作为用户 B 的聊天历史中的最后一条消息,而消息 A 作为用户 A 的聊天历史中的最后一条消息。这在许多用例中都是一个问题,例如考虑到人们在测验中竞争的情况,以及谁先发布正确答案是相关的。
这在 Meteor 中是如何处理的?
潜在解决方案(对于序列完整性至关重要的 Web 应用程序):
没有即时的客户端视图更新。
只需将数据(也是更新请求)发送到服务器,服务器将其添加到中央模型并将其分发给所有客户端(包括创建数据的用户的客户端)。
每个客户端更新其模型和视图,然后向服务器发送一个简短的“我处理了我收到的更新请求”。
服务器等待最后一个这样的信号(忽略断开连接的用户)[1],然后准备好接收下一条数据(下一个更新请求)。如果队列中有项目,请先处理这些项目。
这样,首先到达服务器的数据块将获胜(并在所有客户端上获胜),稍后到达服务器的数据块将在第一个数据块反映在每个客户端之后处理。
(事实上,创建者客户端中的视图更新发生得稍晚一点(因为数据首先通过服务器)我猜这不是一个大问题。)
[1](确保始终处理意外断开连接)
托比