Состояние соединения с doowb / angular-pusher

#angularjs #pusher

#angularjs #толкатель

Вопрос:

Я пытаюсь создать проект Angular с помощью Pusher, используя angular-pusher оболочку. Он работает хорошо, но мне нужно определить, когда пользователь ненадолго теряет интернет, чтобы они могли получить пропущенные изменения в данных с моего сервера.

Похоже, что способ справиться с этим — перезагрузить данные Pusher.connection.state('connected'...) , но, похоже, это не работает angular-pusher — я получаю «Pusher.connection» не определено.

Вот мой код:

 angular.module('respondersapp', ['doowb.angular-pusher']).

    config(['PusherServiceProvider',
        function(PusherServiceProvider) {
            PusherServiceProvider
                .setToken('Foooooooo')
                .setOptions({});
        }
    ]);
var ResponderController = function($scope, $http, Pusher) {
    $scope.responders = [];

    Pusher.subscribe('responders', 'status', function (item) {
        // an item was updated. find it in our list and update it.
        var found = false;
        for (var i = 0; i < $scope.responders.length; i  ) {
            if ($scope.responders[i].id === item.id) {
                found = true;
                $scope.responders[i] = item;
                break;
            }
        }
        if (!found) {
            $scope.responders.push(item);
        }
    });
    Pusher.subscribe('responders', 'unavail', function(item) {
        $scope.responders.splice($scope.responders.indexOf(item), 1);
    });
    var retrieveResponders = function () {
        // get a list of responders from the api located at '/api/responders'
        console.log('getting responders');
        $http.get('/app/dashboard/avail-responders')
            .success(function (responders) {
                $scope.responders = responders;
            });
    };

    $scope.updateItem = function (item) {
        console.log('updating item');
        $http.post('/api/responders', item);
    };

    // load the responders
    retrieveResponders();
};
 

Как бы я мог отслеживать состояние соединения при такой настройке? Я в основном пытаюсь воспроизвести функциональность Firebase «догнать» для точечных подключений, Firebase в целом не работала для меня, слишком запутывая попытки управлять несколькими наборами данных (вообще не стремясь заменить серверную часть).

Спасибо!

Ответ №1:

Похоже Pusher , что зависимость предоставляет только subscribe и unsubscribe . Смотрите: https://github.com/doowb/angular-pusher/blob/gh-pages/angular-pusher.js#L86

Однако, если вы получите доступ PusherService к экземпляру, вы получите доступ к Pusher экземпляру (который предоставляется библиотекой Pusher JS), используя PusherService.then . Смотрите: https://github.com/doowb/angular-pusher/blob/gh-pages/angular-pusher.js#L91

Я не уверен, почему PusherService обеспечивает уровень абстракции и почему он просто не возвращает pusher экземпляр. Вероятно, это для того, чтобы он мог добавить некоторые функции, специфичные для Angular ( $rootScope.$broadcast и $rootScope.$digest ).

Может быть, вы можете установить PusherService как зависимость и получить доступ к pusher экземпляру, используя следующее?

 PusherService.then(function (pusher) {
  var state = pusher.connection.state;
});
 

Комментарии:

1. Можете ли вы привести пример того, как это может работать? Я новичок в Angular, и мне сложно реализовать все эти сервисы реального времени без самых базовых возможностей. Теперь, глядя на PubNub, также, похоже, возникает ряд проблем.

Ответ №2:

Чтобы уточнить ответ @leggetters, вы можете сделать что-то вроде:

 app.controller("MyController", function(PusherService) {
  PusherService.then(function(pusher) {
    pusher.connection.bind("state_change", function(states) {
      console.log("Pusher's state changed from %o to %o", states.previous, states.current);
    });
  });
});
 

Также обратите внимание, что pusher-js (который использует angular-pusher) имеет activityTimeout pongTimeout конфигурацию и для настройки определения состояния соединения.

Из моих ограниченных экспериментов на состояния соединения нельзя полагаться. Со значениями по умолчанию вы можете отключиться на много секунд, а затем снова подключиться к сети, и они не станут мудрее.

Даже если вы понизите значения конфигурации, кто-то, вероятно, может отключиться от сети всего на миллисекунду и пропустить сообщение, если ему не повезет.