Angular + web套接字,如何使用promises?

时间:2015-04-16 08:12:49

标签: angularjs sockets factory angular-promise autobahn

我使用Autobahn.js进行Web套接字连接(我需要订阅套接字事件)。

我使用$ timeout来检查套接字事件。但我认为,这是错误的,不正确的不是最优的,我不想在控制器中使用$ timeout,也许承诺可以帮助我吗? 如何在没有$ timeout的情况下在控制器中捕获套接字消息?



app.factory('socket',['$rootScope',
function($rootScope) {
    var pubsub = new ab.Session(
      'wss://site.com/',
      function(session) {
        return session;
      },
      function(code, reason) {
      }
    );
    return {
      pubsub: pubsub
    };

  }]);




app.controller('mainCtrl', ['$timeout', 'socket', function($timeout, socket) {

 $timeout(function() {
  
  $scope.data = socket.pubsub.subscribe('3434424234324', function(topic, data) { 
    
    
    // do something if data. 
    // data contains socket message.

  });
}, 300);
  
}]);

//3434424234324 - subscriber id




2 个答案:

答案 0 :(得分:3)

WebSockets的一个基本思想是它们是异步的。你不必跟踪他们什么时候做事!如果最终使用$timeout检查套接字是否收到了消息,那么可能出现了一些错误!可以$timeout可以完全删除。

所有套接字接口都将公开处理程序回调函数,这些函数将负责处理套接字可以触发的不同事件。您需要做的是找到Autobahn的message事件处理程序并在那里手动触发$scope摘要。

Autobahn使用发布者/订阅者模型,这意味着您需要掌握subscribe事件处理程序:

socket.pubsub.subscribe('3434424234324', function(topic, data) { 
  // do something if data. 
  // data contains socket message.

  // let angular know something async has happened
  $scope.$apply();
});

然而,我不建议改变所有代码以便这样做,而是建议将Autobahn包装到Angular工厂中,为您处理这种行为。更好的是,使用像angular-wamp这样已经完成此操作的库。

答案 1 :(得分:0)

我想出了一些快速的内容:

app.factory('socket',['$rootScope', function($rootScope) {
    var connection = new autobahn.Connection({
        url: 'url',
        realm: 'realm'
    });

    var collection = {
       'topic1': [],
       'topic2': []
    };

    connection.onopen = function(session) {
        session.subscribe('topic1').then(function(res){
            collection.topic1.push(res);
        });
    };

    connection.open();

    return {
       collection: collection
    }
}]);
app.controller('mainCtrl', ['socket', function(socket) {
     $scope.socket = socket;
}]);

然后在mainCtrl中,您可以访问主题数据,因为它们存储在集合中。如果你想在模板中显示它,你可以简单地使用{{socket.collection.topic1}},或ng-repeat等等。