页面加载时Socket.io显示自己的socketId(angular - factory)

时间:2016-06-21 08:31:11

标签: angularjs sockets socket.io

我正在用一个工厂连接到socket.io,我有一个socketId返回函数给我socketId的连接,这样我就可以在网站上显示它(仅用于现在的测试)

我有我的工厂:

angular.module('testing').factory('socket', ['$rootScope', function($rootScope) {
    var socket = io.connect();

    return {
        socketId: function(){
          return socket.id;
        }
        //some more code here deleted for simplicity
    };
}]);

并在我的控制器代码中:

_this.socketId = socket.socketId();

现在,当我打开页面时,socket.socketId()会返回undefined,但是当我按下该按钮后,我会得到socketId

问题:如何在连接后使socket.io更新我的变量_this.socketId

2 个答案:

答案 0 :(得分:0)

您可以使用'承诺' ,Promise API

return {
    socketId: function(){
      var deferred = $q.defer();
      var socket = io.connect();
      socket.on('connect', function() {
            deferred.resolve(socket.id); //Your socketid
        });
      return deferred.promise;
    }

答案 1 :(得分:0)

看起来控制器中的socketId甚至在套接字连接之前就被初始化了!

如果您只是等待套接字在工厂连接并在连接后广播套接字ID并且您只需在控制器上监听它就不会更好。

//At the factory
var socket = io.connect();
socket.on("connect",function(){
$rootscope.$broadcast("socketId",socket.id);
});

//At the controller
$scope.$on("socketId",function(data){
_this.socketId = data;
});

我希望这会对你有所帮助,如果我在某个地方出错,请随时纠正我。