我使用nodejs在客户端上集成了socket.io和angularjs。我从互联网上取得了angular-socketio的示例,并在其中添加了“disconnect”方法。
Socket服务:
控制器:
但是,当我尝试使用这个方法断开连接时,出现了错误:
“我不明白该挖哪里…”
Socket服务:
angular.module('app')
.factory('socket', ['$rootScope', function ($rootScope) {
var socket = io.connect();
return {
on: function (eventName, callback) {
socket.on(eventName, function () {
var args = arguments;
$rootScope.$apply(function () {
callback.apply(socket, args);
});
});
},
emit: function (eventName, data, callback) {
socket.emit(eventName, data, function () {
var args = arguments;
$rootScope.$apply(function () {
if (callback) {
callback.apply(socket, args);
}
});
})
},
disconnect: function () {
socket.disconnect();
},
socket: socket
};
}]);
控制器:
angular.module('app')
.controller('Controller', ['$scope', 'socket', function ($scope, socket) {
socket.emit('register')
socket.on('connect', function () {
console.log('Socket connected');
});
socket.on('disconnect', function () {
console.log('Socket disconnected');
});
socket.on('register', function (reginfo) {
console.log('Register: %s, cname=%s', reginfo.ok, reginfo.cname);
socket.disconnect(); // <-- this line throw Error
});
socket.on('last', updateSnapshot);
socket.on('state', updateSnapshot);
function updateSnapshot(snapshot) { ... }
}]);
但是,当我尝试使用这个方法断开连接时,出现了错误:
Error: $apply already in progress
at Error (<anonymous>)
at beginPhase (http://localhost:4000/scripts/vendor/angular.js:8182:15)
at Object.$get.Scope.$apply (http://localhost:4000/scripts/vendor/angular.js:7984:11)
at SocketNamespace.on (http://localhost:4000/scripts/services/socket.js:10:32)
at SocketNamespace.EventEmitter.emit [as $emit] (http://localhost:4000/socket.io/socket.io.js:633:15)
at Socket.publish (http://localhost:4000/socket.io/socket.io.js:1593:19)
at Socket.onDisconnect (http://localhost:4000/socket.io/socket.io.js:1970:14)
at Socket.disconnect (http://localhost:4000/socket.io/socket.io.js:1836:12)
at SocketNamespace.<anonymous> (http://localhost:4000/scripts/controllers/controller.js:38:34)
at on (http://localhost:4000/scripts/services/socket.js:11:34)
“我不明白该挖哪里…”
$apply
- 通常这意味着您在某个地方存在错误。然而,这种情况有点独特,因为您正在包装一个默认不与Angular集成的第三方库。 - Michelle Tilley$apply
中包装它们的回调函数。例如,可以查看我为另一个SO问题编写的与jQuery颜色选择器的集成:http://jsfiddle.net/BinaryMuse/x2uwQ/ - Michelle Tilley$$phase
是 Angular 的内部私有变量,因此您不应该真的依赖它来处理像这样的事情。在另一个答案中,Igor 描述了一些应该使用的替代方案。 - Michelle Tilley