我在客戶端上使用帶有socket.io和angularjs的nodejs。我從互聯網上找到了angular-socketio的例子,並在其中添加了disconnect
方法。Node.js + AngularJS + socket.io:連接狀態並手動斷開連接
插槽服務:
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)
而且我不明白的地方挖...
感謝布蘭登!看起來像一個黑客,但它的作品。你如何看待,如果這個檢查是在有角的核心? –
有一個檢查覈心 - 但它會引發錯誤!我認爲,「安全應用」是不是在覈心的原因是_usually_沒有一個很好的理由嵌套'$ apply's - 讓它們通常是你有一個錯誤的地方的標誌。但是,這種情況更具獨特性,因爲您正在封裝未默認與Angular集成的第三方庫。 –
有很多不默認和一大堆的問題,如何與角度使用它們整合酷庫。 –