【问题标题】:Socket.io display own socketId when page loaded (angular - factory)Socket.io 在页面加载时显示自己的 socketId(角度 - 工厂)
【发布时间】:2016-06-21 08:31:10
【问题描述】:

我正在使用工厂连接到 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

【问题讨论】:

    标签: angularjs sockets socket.io


    【解决方案1】:

    你可以使用'promise',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;
        }
    

    【讨论】:

    • 感谢您的回答@Rejs。它没有用,因为我不能再做一个 io.connect() 因为我会得到两个单独的套接字。
    【解决方案2】:

    似乎控制器中的 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;
    });
    

    希望对你有帮助,如有不对之处,欢迎指正。

    【讨论】:

    • 刚刚看到你的编辑@TeeJay。我在控制器中执行 console.log(data) 时得到这个对象:!Object.
    • 你能不能尝试传递socket对象而不是传递socket.id!我会尝试在我的机器上复制它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多