#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
конфигурацию и для настройки определения состояния соединения.
Из моих ограниченных экспериментов на состояния соединения нельзя полагаться. Со значениями по умолчанию вы можете отключиться на много секунд, а затем снова подключиться к сети, и они не станут мудрее.
Даже если вы понизите значения конфигурации, кто-то, вероятно, может отключиться от сети всего на миллисекунду и пропустить сообщение, если ему не повезет.