我是Angular.js和Node.js的初学者,但我意识到有两种可能的方法来制作实时应用程序。第一个是使用Socket.io,另一个是使用RESTful和setInterval()函数作为客户端解决方案。我使用两种替代方案构建了我的应用程序,但我不知道为什么使用一种替代方案更好。
我的控制器使用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);
}
这些做事方式之间会有什么不同? 提前谢谢!
答案 0 :(得分:8)
如果您想要一个完全实时的Web应用程序,那么套接字是可行的方法。 Socket.io或SockJS都是非常好的客户。当不支持Web套接字时,它们可以优雅地降级,但是,您可以选择您想要使用的传输方法。
您必须构建数据订阅服务,以便在所有用户之间传播更改。 Tower.js和Meteor都使用被动方法,他们在模型更改时使用事件监听器。根据您希望此功能的复杂程度或强大程度,它们将是不同的可用实现。
尝试在一次连接的多个用户之间同步客户端和服务器端数据时,它确实变得越来越复杂。我建议你看看这两个框架,看看它们是如何工作的,并且可能复制它的一部分,或者它的所有功能。
答案 1 :(得分:6)
根据您的使用案例,我认为Socket.IO是可行的方法。但是,使用带有Angular的WebSockets有一些注意事项。我建议你看看我刚才写的关于这个主题的博客文章:http://briantford.com/blog/angular-socket-io.html
答案 2 :(得分:3)
我们不得不选择推送器(使用Websocket)和使用Ajax进行发布/订阅实时事件的Pubnub之间的替代方案。当尝试跨应用程序的不同用户进行实时通信时,您的Angular RESTful替代方案是不够的。例如,您有一个团队使用的项目管理应用程序。一个团队成员可能正在添加/更新任务,而另一个团队成员可能正在同时查看。需要发布更新,并且当前登录的所有其他用户将订阅已更改的事件并可以通知。
我们一直在使用Pubnub并且它的工作速度非常快,尽管Pusher的技术更好但目前并不是所有浏览器都支持。
我知道问题出在AJ和NodeJS上,但我觉得使用第三方订阅/发布API可以更容易管理,因为您不必管理nodejs服务器和更大的负载(当您的应用程序流行时)。 Pusher / Pubnub是可扩展的,您可以根据需要扩展您的应用程序。
答案 3 :(得分:2)
最好在你的情况下使用Socket.io。
因为您似乎与后端进行了大量的交互。如果它是这样的,而不是间隔查询api,只需使用Socket.io。
使用套接字将减少后端和客户端的工作,并且还可以更轻松地控制基于事件的内容。
答案 4 :(得分:2)
Socket.io具有以下优点:
REST具有以下优势:
这些要点中的每一点都值得长期讨论,有些依赖于应用程序的特性。但如果你按优先级标记它们,你会看到最适合你的东西。