Socket.io发出没有发送

时间:2015-10-29 15:15:03

标签: javascript socket.io requirejs

我制作了一个简单的游戏平台。它是一个单页的应用程序。顶级元素是index.html,不同的视图被加载到它的div" app-view"使用下划线和require.js。网页通过socket.io与服务器通信,socket.io是在第一页加载期间在顶层创建的。这是我的main.js和nameSelection.js:

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调用有时会起作用。我完全感到困惑,并希望得到任何帮助。

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

  1. 添加" socket.emit(' setPlayerName',{name:' username'});"外部按钮单击处理程序
  2. 启动服务器
  3. 在浏览器中打开页面(此时,在客户端上打印确认)
  4. 删除添加的行
  5. 在表单中输入用户名并单击按钮(再次打印确认)
  6. 但是,如果我在不执行步骤1-4的情况下重新启动服务器并执行步骤5,则不会将消息发送到服务器。

0 个答案:

没有答案