【问题标题】:socket.io, server emit event before client set up listener for that eventsocket.io,服务器在客户端为该事件设置监听器之前发出事件
【发布时间】:2015-11-01 01:22:39
【问题描述】:

在以下代码 sn-p(使用 node.js 和 socket.io 库)中,有时(有时不会)服务器在客户端为 @ 设置套接字侦听器之前发出事件 something 987654322@ 事件将导致关联的匿名函数无法执行。

客户端:index.html

<script src="socket.io/socket.io.js"></script>
<script>
   ...
   var socket = io.connect('http://localhost:8080/abc');
   ...
</script>
<script src="/somewhere/test.js"></script>

test.js 的内容

...
console.log(new Date().getTime(), 'debugging');

socket.on('something', function(data) {
// will not execute
console.log(data);
});
...

服务器端:

io.of('/abc').on('connection', function(socket) { 
   console.log(new Date().getTime(), 'EMIT SOMETHING');
   io.of('/abc').emit('something', 'b');
});

客户端的console.log结果:1439057954676 debugging
服务器端console.log结果:1439057954114 EMIT SOMETHING

在上面的例子中,为什么服务器在客户端设置监听器之前发出事件?

【问题讨论】:

  • 仅供参考,您应该知道,在 localHost 上运行与通过 Internet 运行到远程服务器时,您可能会遇到不同的时间问题,因为 localHost 的响应速度要快得多。
  • @jfriend00,当然,但无论代码运行的环境如何,所描述的场景都不应该发生
  • 是的,逻辑上会说这不应该发生,但是你能指出我在 localHost 上运行时不应该发生的规范吗?对于图像,如果您执行img.src = "xxx.jpg"; 后跟img.onload = function() {...},您可能会错过load 事件(如果图像在缓存中),因此在附加处理程序之前不会超出浏览器触发某些内容。

标签: javascript node.js socket.io


【解决方案1】:

尝试将 var socket = io.connect('http://localhost:8080/abc');socket.on('something', function(data) 放在同一个脚本标签。
(基本上尝试在一个 HTML 元素中制作整个脚本,而不是将它们分开。)

【讨论】:

  • 这应该没什么区别。
  • 如果这些脚本块不是内联的,而是在单独的 .js 文件中(很可能),那么它绝对会有所作为。
  • 好吧,我不知道浏览器是如何处理 HTML 的,但在我看来,唯一可能的方式是服务器甚至能够在执行简单的操作之前向客户端发送消息代码行如下:客户端加载第一个“.js”文件,然后执行它(形成连接)。然后它开始加载另一个“.js”文件,这需要一些时间,此时服务器已经发出事件。将所有客户端代码放在同一个“.js”文件中应该可以解决这个问题。
  • 除非这不是 OP 的代码显示的内容。它显示了两个内联的&lt;script&gt; 标签,它们显然在同一个文件中。
  • 两件事: 1. 示例代码可能与 OP 在他的电脑上的实际代码不同。 2. 甚至内联脚本在让其他人加载之前就开始执行? (似乎不太可能,但还有其他解释吗?)
猜你喜欢
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2012-01-29
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多