与doowb / angular-pusher的连接状态

时间:2014-06-24 22:26:27

标签: angularjs pusher

我正在尝试使用Pusher使用angular-pusher包装器构建一个Angular项目。它运行良好,但我需要检测用户何时短暂丢失互联网,以便他们可以从我的服务器检索错过的数据更改。

看起来处理这种情况的方法是重新加载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对我来说并不全面,对于尝试管理多个数据集感到困惑(根本不想替换后端)。

谢谢!

2 个答案:

答案 0 :(得分:0)

Pusher依赖关系似乎只公开subscribeunsubscribe。看到: https://github.com/doowb/angular-pusher/blob/gh-pages/angular-pusher.js#L86

但是,如果您访问PusherService,则可以使用Pusher访问PusherService.then实例(Pusher JS库提供的实例)。看到: 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 :(得分:0)

为了澄清@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(使用角度推送器)具有activityTimeoutpongTimeout配置来调整连接状态检测。

根据我的有限实验,无法依赖连接状态。使用默认值,您可以离线很多秒,然后重新联机,而不会更明智。

即使你降低配置值,​​有人可能会离线一毫秒,如果他们不走运就会错过一条消息。