2014-09-12 2 views
5

Я работаю с узлом 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 и т. Д., Но ни одно из них не сработало, и мне не нравится, что сокет, похоже, все еще существует даже после полного уничтожения области, даже если я МОГУ ее взломать, чтобы перестать пытаться подключиться.

Благодаря

ответ

1

Когда я имел дело с подобными вопросами я имел вывод, что SocketIO имеет беспорядочное государственное управление, мягко говоря ... Так что я бы попытаться создать свою собственную логику повторного соединения, например отключить повторное подключение при отключении или ошибке и только повторно подключиться, если я захочу.

Я также хотел бы использовать собственный SocketIO с государственными обработчиками, например (stuff) => $timeout(() => myHandler(stuff)), и разместить вокруг него одноэлементный угловой сервис. Таким образом, ваша голова не будет болеть о закрытии модалов, потерянных областей и т. Д.

Также, пожалуйста, присылайте свои результаты, мне очень интересно то, что вы испытали с тех пор.

+1

Эй, спасибо за ответ. Я недавно не работал над этим, и у меня не будет возможности снова работать над этим (функции были в prod в течение некоторого времени и, похоже, были стабильными). Конечный результат, который работал нормально для нас, заключался в том, чтобы установить конфигурацию (отправленную в io.connect), чтобы иметь forceNew = true. Оттуда я вручную создаю сокет с var ioSocket = io.connect (URL + ':' + PORT, options); var socket = socketFactory ({ioSocket: ioSocket}); Оттуда, пытаясь отключиться, я сначала удаляю все прослушиватели на сокете, а затем вызываю socket.disconnect(). Это до сих пор работало на нас. –

+0

Спасибо, мы используем принудительное повторное подключение и вручную вызываем disconnect(). Я надеюсь, что ребята SocketIO сделают надежную государственную машину или что-то еще ... –