【问题标题】:Storing data for global access without global variable在没有全局变量的情况下存储用于全局访问的数据
【发布时间】:2013-02-08 17:48:43
【问题描述】:

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

  • 【问题讨论】:

      标签: javascript socket.io


      【解决方案1】:

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

      【讨论】:

        【解决方案2】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-08-11
          • 2019-05-02
          • 1970-01-01
          • 2013-09-25
          • 2013-10-19
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          相关资源
          最近更新 更多