10

我是 Angular.js 和 Node.js 的初学者,但我已经意识到制作实时应用程序有两种可能的方法。第一个是使用 Socket.io,另一个是使用带有 setInterval() 函数的 RESTful 作为客户端解决方案。我使用这两种替代方法构建了我的应用程序,但我不知道为什么使用一种替代另一种更好。

我的控制器使用 Angular.js(Socket.io 替代品):

function MyController($scope, socket) {

  socket.on('test', function(data){
    $scope.data = data;
    console.log($scope.data);
  });

}

我的控制器使用 Angular.js(RESTful 替代方案):

function MyController($scope, $http) {

  setInterval(function() {
    $http.get('/test.json')
         .success(function(data, status, headers, config) {
           $scope.data = data;
           console.log($scope.data);
         });
  }, 1000);

}

这些做事方式之间有什么区别?提前致谢!

4

5 回答 5

8

如果您想要一个完全实时的 Web 应用程序,那么套接字就是您的最佳选择。Socket.io 或 SockJS 都是非常好的客户端。当不支持 web 套接字时,它们有能力优雅地降级,但是,您可以选择您想要使用的传输方式。

您必须构建数据订阅服务,以便在所有用户之间传播更改。Tower.js 和 Meteor 都使用响应式方法,并且它们在模型更改时使用事件侦听器。根据您想要此功能的复杂程度或功能的强大程度,它们将是不同的可用实现。

当尝试在同时连接的多个用户之间同步客户端和服务器端数据时,它确实变得越来越复杂。我建议你看看这两个框架,看看它们是如何工作的,并可能复制它的一部分,或者它的全部功能。

于 2012-12-30T13:25:01.240 回答
6

根据您的用例,我认为 Socket.IO 是要走的路。但是,在 Angular 中使用 WebSockets 有一些注意事项。我建议你看看我不久前写的一篇关于这个主题的博客文章:http: //briantford.com/blog/angular-socket-io.html

于 2012-12-31T17:55:36.070 回答
3

我们必须在推送器(使用 Websocket)和使用 Ajax 发布/订阅实时事件的 Pubnub 之间进行选择。在尝试跨应用程序的不同用户进行实时通信时,您的 Angular RESTful 替代方案是不够的。例如,您有一个团队使用的项目管理应用程序。一名团队成员可能正在添加/更新一项任务,而另一名成员可能正在同时查看。需要发布更新,并且当前登录的所有其他用户都将订阅更改的事件并可以收到通知。

我们一直在使用 Pubnub,它的运行速度非常快,虽然 Pusher 的技术更好,但目前并非所有浏览器都支持。

我知道问题是针对 AJ 和 NodeJS,但我觉得使用第三方订阅/发布 API 更容易管理,因为您不必管理 nodejs 服务器和更大的负载(当您的应用程序流行时)。Pusher/Pubnub 是可扩展的,您可以根据需要扩展您的应用程序。

于 2012-12-30T09:40:43.357 回答
2

在您的情况下最好使用 Socket.io。

因为您似乎与后端进行了很多交互。如果是这样,而不是每隔一段时间查询 api,只需使用 Socket.io。

使用套接字将减少后端和客户端的工作量,并且还可以更轻松地控制基于事件的内容。

于 2012-12-30T08:14:58.250 回答
2

Socket.io 具有以下优点:

  • 减少不必要的流量和渲染
  • 低延迟
  • (可以说)更简洁的代码

REST 具有以下优点:

  • 支持所有浏览器和客户端
  • 较少开放的连接
  • 在集群、代理和其他复杂的网络拓扑中工作得更好

这些观点中的每一个都值得单独进行长时间的讨论,其中一些在很大程度上取决于应用程序的特性。但是,如果您按优先级标记它们,您会看到什么可能最适合您。

于 2012-12-30T13:13:36.077 回答