存储没有全局变量的全局访问数据

时间:2013-02-08 09:38:55

标签: javascript socket.io

我正在制作node.js游戏服务器,我正在使用socket.io来获取webscockets和房间。 然而,这主要是一个纯JavaScript问题:

我正在为每2个玩家创建一个随机数的房间,它的工作原理如下:

  • 生成并随机存储随机房号;
  • 玩家加入房间
  • 如果他是这个房间的第二个玩家,会产生一个新的房间号码,下一个玩家会加入下一个随机数字房间

    var openRoom = Math.floor(Math.random() * 90000) + 10000;
    
    io.sockets.on('connection', function (socket) {
    
        socket.on('addPlayer', function(username) {
    
            if (io.sockets.clients(openRoom).length <= 2)  {
                socket.join(openRoom);
            } else {
                openRoom = Math.floor(Math.random() * 90000) + 10000;
                socket.join(openRoom);
            }
    ...
    

    有没有办法不使用全局openRoom

  • 2 个答案:

    答案 0 :(得分:3)

    您需要使用闭包,以便openRoom变量暴露给内部函数。

    例如:

    (function() {
    
    var openRoom = Math.floor(Math.random() * 90000) + 10000;
    
    io.sockets.on('connection', function (socket) {
    
        socket.on('addPlayer', function(username) {
    
            if (io.sockets.clients(openRoom).length <= 2)  {
                socket.join(openRoom);
            } else {
                openRoom = Math.floor(Math.random() * 90000) + 10000;
                socket.join(openRoom);
            }
    ...
    
    })();
    

    您还可以创建一个全局对象,用于存储任何全局变量:

    if (typeof window['MyApp'] == 'undefined') {
    
        MyApp = {
            someVar: someValue
        };
    
    }
    

    这可以让你以后获取/设置它:

    var x = MyApp.someVar;
    

    答案 1 :(得分:0)

    查看Redis.io等数据存储解决方案。它们专为这些瞬态事物而设计,可以帮助您不会使用全局变量使代码混乱,同时具有足够的性能,不会明显减慢速度。

    使用redis,您只需调用一个函数,该函数使用新值更新redis中的键。