我在angular.js中创建了一个服务,在我的控制器中使用socket.io,就像它是一个回调函数。在我的服务中,发射器和监听器与我在控制器中使用的功能相同,如下所示。
service.js
(function () {
/* Socket IO Service */
var service = angular.module('MyService', ['']);
service.factory('sio', ['$http', function($http){
var socket;
socket = io.connect('http://localhost:3000');
return {
/* queries user */
login: function(authData, callback){
socket.emit('__app auth login', authData);
var response = socket.on('__app auth login', function(res){
callback("", res);
});
return response;
},
findUser: function(conditions, callback){
socket.emit('__app user find', conditions);
var response = socket.on('__app user find', function(res){
callback("", res);
});
return response;
},
};
}]);
})();
我的控制器
(function () {
/* My Controller */
var myController = angular.module('MyCtrl', ['']);
myController.controller('MyController', function($scope, sio){
var conditions = {username:"john123"};
$scope.conditions = conditions;
$scope.message = "Hello";
this.search = function(){
sio.findUser(conditions, function(err, response){
$scope.message = response.status;
console.log(response);
});
}
$scope.search = this.search;
});// /--ctrl
})();
一切似乎都有效,我的问题是,是否存在使用它的问题或缺点?或者我应该只在服务中包装socket.io对象?谢谢你提前。
答案 0 :(得分:0)
除了潜在的违反预期行为之外,没有固有的缺点,具体取决于公认的最佳实践。问题是它们是否与它们一致。
因为实际的工作(连接和保持打开连接的插座)是在单件服务中完成的,所以您不必担心连接死亡。
尽管如此,最佳实践将要求所有与服务相关的工作都应该在服务本身中完成。这是否延伸到承诺的回调?根据{{3}},应该从服务返回promise,以便它们可以在调用控制器中链接。
因此,根据AngularJS社区内大量意外情况目前被认为是最佳做法,您的实施不会 不 符合绝对最佳做法,尽管是完全合理的。