【问题标题】:AngularJS: combine REST with Socket.IOAngularJS:结合 REST 与 Socket.IO
【发布时间】:2014-03-29 17:18:40
【问题描述】:

在我最近构建的单页 web 应用程序中,我正在使用 Restangular 模块为我的模型获取数据。我想向应用程序添加实时更新,以便每当在服务器上更改或添加任何模型时,我都可以更新我的模型列表。

我已经看到这在 Trello 等网络应用中运行良好,您可以在不刷新网页的情况下查看更新。我确定 Trello 网络客户端使用 REST API。

什么是构建服务器和客户端来归档此文件的正确方法?

【问题讨论】:

    标签: angularjs rest socket.io


    【解决方案1】:

    首先,你的问题太笼统了,可以有很多依赖的解决方案 根据您的需求和条件。

    我将为您简要概述 当您想离开 REST API 时的一个案例 并通过网络套接字添加一些实时

    1. 从 REST 中获取所有数据——仅用于通知的 Soket。

      优点: 易于实现服务器端和客户端。您只需要在服务器上发出事件 有关已修改资源的信息(如资源名称和 ID),并在客户端捕获这些事件并获取 REST API 的数据。

      缺点: 每一次通知都会向服务器发出一个请求。当单个资源有很多活动客户端时,这会显着增加流量(它们会向服务器生成大量反向请求)。

    2. 从 REST 中获取初始负载——带有数据负载的通知的套接字。

      优点:所有信息都随通知一起提供,不会对服务器产生新的请求,因此我们的流量较少。

      缺点:更难实现服务器端和客户端。您需要将数据添加到服务器上的所有事件。您需要从客户端的所有事件中获取数据。

      根据评论更新

      至于处理不同类型的模型(只是一种方法)。

      客户端。

      1. 为每个模型保留factory
      2. 请记住,您只需要对显示的数据进行实时更新(在大多数情况下),因此您可以轻松地 使用内存缓存(这样您就可以通过 ID 找到任何实体)。
      3. 为每种类型的更改添加侦听器 (Created, Updated, Deleted)。
      4. 在任何监听器中,你应该调用一些initObject函数,它会通过ID和extend在缓存中找到实体,如果没有具有这样ID的实体,只需创建一个新实体并将其添加到缓存中。
      5. 任何Delete 只会从缓存中删除一个实体。

      任何时候你需要这个资源,你应该返回缓存对象的链接以保持双向数据绑定(这就是我使用extend而不是=的原因)。当然,您需要处理以下情况:“用户正在编辑资源,同时收到有关删除的通知”。

      服务器端。

      1. 发送所有模型比发送修改字段更容易(在这两种情况下,您都必须发送资源的 ID)。
      2. 针对所有参与用户的任何Create, Update, Delete 事件推送事件。
      3. 事件名称应包含操作名称(如新建、更新、删除)和资源名称(如用户、任务等)。因此,您将拥有NewTaskUpdateTask 事件。
      4. 事件负载应包含模型或仅包含带有 ID 的修改字段。

      可以通过两种方式处理集合更改:添加/更新/删除集合中的项目或更改整个集合。

    PUT, POST, DELETE 等所有修改当然都是使用 REST 进行的。

    我为案例 1) 做了一个超级简单的伪要点。 https://gist.github.com/gpstmp/9868760 但它可以针对案例 2 进行更新,就像这样 https://gist.github.com/gpstmp/9900454

    希望这会有所帮助。

    【讨论】:

    • 好点和有用的要点。从利弊来看,我更喜欢案例 2,因为没有来自服务器的冗余数据。据我从浏览器中的网络活动中可以猜到,这就是 Trello 的人正在做的事情。你能详细说明一下情况2吗?具体来说,您将如何处理不同类型的模型和集合的变化?
    • 根据您的评论更新了答案。
    • 我使用选项。 1 为简单起见和选择。 2 当它变成选项时。 1 对于某些用户来说太慢了(这种情况并不经常发生)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多