Socket-Io:客户端' connect'套接字已设置时,事件未触发

时间:2014-05-01 18:19:49

标签: javascript sockets socket.io listener

我在浏览器控制台中设置了带有socketio的websocket,以便

socket.socket.connected

返回true。但如果我再添加:

socket.on('connect', function () {console.log('some'); });

没有任何反应,即'某些'未记录。这是来自官方socket-io页面:

var socket = io.connect();
    socket.on('connect', function () { 
    socket.emit('ferret', 'tobi', function (data) {
      console.log(data); 
    });
  });

我认为这段代码正常运行。但我现在怀疑它只能起作用,因为当设置了监听器(即socket.on...)时,套接字没有连接,只是因为设置连接的延迟,当连接时监听器处于活动状态。成立。如果这是正确的,那么这意味着如果我在调用io.connect()之后得到一个具有不合理高负载的客户端,以便在设置监听器之前建立连接,那么因为监听器而遇到麻烦永远不会开火。

  • 这是对的吗?
  • 如何设置在两种情况下都会触发的侦听器:
    1. 设置侦听器时尚未建立连接
    2. 建立侦听器时已建立连接

谢谢你,以及最好的问候

2 个答案:

答案 0 :(得分:0)

callBackOnConnect: function(socket, callback) {
    if (socket.socket.connected) {
        callback();
    } else {
        socket.on('connect', function() {
            callback();
        });
    }
}

AFAIK这是安全的 - 虽然不是很确定。

答案 1 :(得分:0)

虽然我在文档中找不到它,但在调用io.connect()之后,我运行了一些测试对客户端施加了很大的压力。在所有情况下,客户端的“connect”事件在设置完最后一个侦听器后触发。例如:(感谢www.sean.co.uk的JavaScript延迟)

var socket = io.connect();

// www.sean.co.uk
function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while(curDate-date < millis);
}

//keeps processing for 5 seconds to simulate
//any CPU-intensive process
pausecomp(5000);

//listener gets set up after delay
socket.on('connect', function() {
    //the time that the connect event is fired is compared
    //with the listener's set up time
    console.log(new Date().getTime() - setUpTime);
});

//the time that the listeners are set up is logged
var setUpTime = new Date().getTime();

每次我跑这个时,都记录了一个积极的结果(而不是根本没有得到结果)。有趣的是,暂停越高,设置“连接”后就越长。我知道这不是证明,但它至少是暗示性的。

关于何时应该设置监听器,只要它们位于io.connect()之后并且它们不在回调内,它们将在服务器触发'connection'事件之前设置,我可以告诉客户的'connect'事件。如果有人能指出我的资源方向,详细了解如何以及何时调用这些内置事件,我将不胜感激,但据我所知,他们只是工作而不必担心这些事情。