为啥浏览器中未定义socket.id

Posted

技术标签:

【中文标题】为啥浏览器中未定义socket.id【英文标题】:why is socket.id undefined in the browser为什么浏览器中未定义socket.id 【发布时间】:2015-11-12 09:22:44 【问题描述】:

如果我执行 console.log(socket),我会在 firebug 中得到一个套接字对象。在 obj 中,我可以看到带有 id 的属性,并且可以看到 id 的值。但是当我做 console.log(socket.id) 我得到未定义的。为什么?

   var socket = io();
    $(document).ready( function()
        console.log(socket);
        console.log(socket.id);
        console.log(socket.ids);
        $(".click").on("click", function(e)
            alert("clicked")
            socket.emit("clicked", socket.id)
            $(this).addClass("removeclick");
        )
     );

ps 我可以得到socket.ids,它是 0 但不是 socket.id。

【问题讨论】:

当我在 firebug 中执行 console.log() 时,它按预期工作。你试过吗? 另外,尝试将您的代码更改为console.log(JSON.stringify(socket)),我想您会明白发生了什么。 for console.log(JSON.stringify(socket)) 我得到 TypeError: cyclic object value。这是我应该看到的吗? 嗯。好的。所以它不可字符串化。当调用console.log() 时,您应该看到套接字对象尚未连接。但是您可以看到已连接的套接字对象的原因是控制台显示了该对象的实时引用,因此您看到的实际上是 socket 的未来版本 为了向自己证明这一点,请在 setTimeout() 中打印 socket.id 【参考方案1】:

设置端口Lister并通过匿名函数'http://localhost:8000'获取id

this.socket = io('http://localhost:8000');
    this.socket.on('connect' , () => 
      console.log(this.socket.id);
    );

【讨论】:

【参考方案2】:

Socket.io 需要一些时间来建立连接。我发现在客户端获取 ID 的最佳方法是:

socket.on('connect', () => console.log(socket.id));

'connect' 是连接就绪时发出的系统事件。

(我当前的socket.io版本是1.7.2)

【讨论】:

以上是关于为啥浏览器中未定义socket.id的主要内容,如果未能解决你的问题,请参考以下文章

为啥此 setInterval 中未定义此 useRef 值?

为啥声明类型时可以在 redux 中未定义状态?

为啥使用 GTKGLArea 时在 PyOpenGL 中未定义 glGenVertexArrays

为啥我的变量在 useEffect 中定义的其他地方在反应中未定义?

为啥在使用 Promise 时在类方法中未定义“this”? [复制]

为啥 this.$refs 在 Vue 子组件中未定义?