Javascript Socket.io发出不';不发送

Javascript Socket.io发出不';不发送,javascript,socket.io,requirejs,Javascript,Socket.io,Requirejs,我正在做一个简单的游戏平台。这是一个单页的应用程序。顶层元素是index.html,使用下划线和require.js将不同的视图加载到其div“app view”中。网页通过socket.io与服务器通信,socket.io在第一次页面加载期间在顶层创建。以下是我的main.js和nameSelection.js: define(function (require) { return { render : function (socket, changeView) {

我正在做一个简单的游戏平台。这是一个单页的应用程序。顶层元素是index.html,使用下划线和require.js将不同的视图加载到其div“app view”中。网页通过socket.io与服务器通信,socket.io在第一次页面加载期间在顶层创建。以下是我的main.js和nameSelection.js:

define(function (require) {

    return {
        render : function (socket, changeView) { 

            $('#setNameButton').click(function(){
                console.log("set username");
                var username = document.getElementById("username").value;
                console.log(username);
                var obj = {};
                obj.name = username;
                console.log(obj);
                socket.emit('setPlayerName', obj);

            });
        }
    }
});
main.js:

define(function (require) {
    console.log("app loaded");

    var _ = require('underscore');
    var $ = require('jquery');
    var nameSelection = require('./nameSelection');

    var socket = io();

    var changeView = function(name, callback, options, container) {
        console.log('changeView()');
        if (container === undefined) {
            console.log("container undefined");
            container = '#app-view';
        }
        if (options === undefined) {
            console.log("options undefined");
            options = {};
        }

        var path = 'text!./templates/' + name + '.ejs';
        var view = require([path], function(template) {
            view = template;
            var tpl = _.template( view );
            $(container).html( tpl (options) );
            callback();
        });

    }

    changeView('nameSelection', function() {
        nameSelection.render(socket, changeView);
    });


    socket.on('connectionSuccessful', function(data) {
            var div = document.getElementById('nameError');
            div.innerHTML = "id: " + data.id;
    });

});
nameSelection.js:

define(function (require) {

    return {
        render : function (socket, changeView) { 

            $('#setNameButton').click(function(){
                console.log("set username");
                var username = document.getElementById("username").value;
                console.log(username);
                var obj = {};
                obj.name = username;
                console.log(obj);
                socket.emit('setPlayerName', obj);

            });
        }
    }
});
问题是按钮单击处理程序中的socket.emit调用不向服务器发送数据。如果我在处理程序外部进行类似的调用,它会工作(当然是在页面加载时)。所有日志消息都已正确打印。此外,有时连接会丢失并自行重新连接,之后socket.emit调用有时会工作。我完全糊涂了,如果能帮上忙,我将不胜感激

编辑:当我按以下顺序操作时,它工作正常:

  • 在按钮点击处理程序外添加“socket.emit('setPlayerName',{name:'username'});”
  • 启动服务器
  • 在浏览器中打开页面(此时,在客户端上打印确认)
  • 删除添加的行
  • 在表单中写入用户名并单击按钮(再次打印确认)

  • 但是,如果我在不执行步骤1-4的情况下重新启动服务器并执行步骤5,则消息不会发送到服务器

    我没有使用socket.io,但在其他使用基于websocket的通信的情况下,我需要在连接丢失时重新启动客户端。是否有自动重新连接选项?您能否捕获连接丢失的事件并自己重新启动它?