Я работаю с узлом socket.io-сервером и угловым сокетом-клиентом (используя angular-socket.io), и он работает хорошо, за исключением одного конкретного условия: я не могу понять, как полностью уничтожьте сокет, когда я закончил с ним, когда сокет не смог подключиться.AngularJS: socket.io destroy socket
Рабочий процесс таков: на данной странице есть кнопка для открытия модальной формы, открытие модального ввода фабрики сокетов в контроллер модалов и подключение к серверу socket.io. Все это хорошо работает, когда сокет может подключаться. Когда модальная функция закрыта, вызывается $ scope.destroy и обработчик в модальном контроллере пытается очистить сокет.
Этот модаль может быть закрыт и повторно открыт несколько раз или только один раз. Мой процесс создания/уничтожения сокета несколько раз может быть частью моей проблемы, это может быть не правильная парадигма, но когда модаль закрыт, не будет возможности взаимодействовать с ним, и после того, как эта страница останется, сокет, конечно, не будет не нужно существовать или оставаться связанным.
Оправа Создание:
angular.module('app.common.newSocketFactory', ['btford.socket-io'])
.factory('newSocketFactory', ['socketFactory', function(socketFactory){
return function(){
return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})});
};
}]);
Injection:
angular.module('...', [
'app.common.newSocketFactory',
....
])
.controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ...
function ($scope, $modalInstance, newSocketFactory, ...){
...
$scope.socket = newSocketFactory();
Вот мой уничтожить обработчик:
$scope.$on('$destroy', function(){
$scope.socket.emit('unlisten');
$scope.socket.disconnect(); //have tried passing true too.
});
Это работает правильно, когда сокет был в состоянии соединить до модальный было закрыто, отключенное событие на сервере указывает, что клиент отключен. Кроме того, я могу закрыть modal и THEN выключить сервер, и никакая попытка повторного подключения не произойдет.
Когда сервер закрыт при открытии модального объекта, возникают транзакции TransportErrors и попытки повторного подключения. Если в этот момент я закрою модальность, ошибки продолжатся, и если я перезапущу сервер, повторение будет успешным и клиент подключится к серверу. В худшем случае я использую этот сокет для поддержки атомарного доступа к части оборудования, которая блокируется первым сокетом. Если я не перезапущу сервер, разрешите сокет подключиться, а затем закройте модальный (запуск $ destroy в моей области выделения и socket.disconnect()), я должен обновить всю страницу, чтобы уничтожить сокет.
Это потенциально вопрос angular-socket.io или обычный вопрос сокета socket.io. Я спросил у github в angular-socket.io без ответа, как правильно распоряжаться угловым гнездом клиента. Без ответа.
Мой вопрос: А) Если я не делаю основной faux-pas с socket.io, как я могу безопасно распоряжаться этим клиентским сокетом, а B) Если я делаю это неправильно, то что лучше перейти к управлению веб-сайтом, который не должен сохраняться со страницы на страницу.
Примечание. Разъем angular-socket.io просто обертывает родной сокет некоторыми материалами, чтобы помочь справиться с угловыми областями. При вызове функции disconnect() результатом является то, что похоже на основной сокет. Я попытался установить параметры повторного подключения на false и т. Д., Но ни одно из них не сработало, и мне не нравится, что сокет, похоже, все еще существует даже после полного уничтожения области, даже если я МОГУ ее взломать, чтобы перестать пытаться подключиться.
Благодаря
Эй, спасибо за ответ. Я недавно не работал над этим, и у меня не будет возможности снова работать над этим (функции были в prod в течение некоторого времени и, похоже, были стабильными). Конечный результат, который работал нормально для нас, заключался в том, чтобы установить конфигурацию (отправленную в io.connect), чтобы иметь forceNew = true. Оттуда я вручную создаю сокет с var ioSocket = io.connect (URL + ':' + PORT, options); var socket = socketFactory ({ioSocket: ioSocket}); Оттуда, пытаясь отключиться, я сначала удаляю все прослушиватели на сокете, а затем вызываю socket.disconnect(). Это до сих пор работало на нас. –
Спасибо, мы используем принудительное повторное подключение и вручную вызываем disconnect(). Я надеюсь, что ребята SocketIO сделают надежную государственную машину или что-то еще ... –