繁体   English   中英

存储数据以进行全局访问而无需全局变量

[英]Storing data for global access without global variable

我正在制作一个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

  • 您需要使用闭包,以便将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;
    

    查看像Redis.io这样的数据存储解决方案。 它们是为这类瞬态事件而设计的,以帮助您避免因全局变量而使代码混乱,同时使其性能不至于明显降低速度。

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

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM