【问题标题】:Real time update with Angular and Socket使用 Angular 和 Socket 实时更新
【发布时间】:2014-09-19 18:27:40
【问题描述】:

我对当前使用 Angular 和 Socket.io 的实时实现有疑问。

  • 我在 Angular 中有一个模型,我使用 $scope.$watch() 观察它以进行修改。
  • 当我检测到修改时,我会通过套接字向我的服务器发送一条消息。
  • 当我的服务器检测到对此更新的调用时,我会保存修改并将修改发送给其他用户
  • 其他用户会收到有人修改的通知。

但是,我对这个实现有一个问题:

  • 用户 A 更新字段
  • 向服务器发送消息
  • 保存到服务器
  • 向用户发送更新通知
  • 通知用户 B
  • 用户 B 模型已更新
  • 手表检测到用户B的模型发生变化并发送通知
  • 向服务器发送消息
  • 保存到服务器
  • 等等……

那么,我的问题是,如何避免这种无限循环和无限更新?

【问题讨论】:

  • 也许您会发现这个示例很有用,它显示了由 Angular 显示并从 Lightstreamer(而不是 Socket.io)接收的实时更新。

标签: angularjs socket.io real-time


【解决方案1】:

您可以在客户端定义一个名为 changed_elsewhere 的变量。 changed_elsewhere 的默认值为 false。

当您在套接字上收到来自服务器的新值时,请将 changed_elsewhere 设置为 true。然后,在观察者上,仅当 changed_elsewhere 为 false 时才将新更改的值发送到服务器。如果 changed_elsewhere 为真,那么您知道该值已经在服务器上,您不需要再次发送它。

最后,你的 watcher 应该是这样的:如果 changed_elsewhere 为 true,则将 changed_elsewhere 转为 false,不要什么都不做;如果 changed_elsewhere 为 false,则将新值发送到服务器。

很抱歉,如果 changed_elsewhere 名称不是很具有暗示性,但我希望您能理解我的想法。

【讨论】:

  • 好的,我测试了这个解决方案,但是使用了一个具有服务器返回值的变量(不仅是真/假),并且在我的手表中,如果这个变量中的值等于我的新值值,我什么都不做!并且似乎有效。谢谢你的伎俩!
【解决方案2】:

为什么不创建两个模型?一种是从服务器同步的,另一种是监视更改的。您不是直接将它们添加到控制器的作用域中,而是创建一个服务,将其作为一个模型呈现给控制器,但在幕后它管理差异?

【讨论】:

  • 我没有测试你的解决方案,但似乎是个好主意,但对我来说有点限制。我有一个具有多个属性的对象,并且每个属性都有一个手表。复制模型(在我的情况下可能非常重)在我的情况下不是最好的主意。但是谢谢你的伎俩
猜你喜欢
  • 2017-11-09
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2017-09-13
  • 2013-12-27
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多