【问题标题】:Why this JS code is being blocked by a few simple lines of code? [closed]为什么这段 JS 代码被几行简单的代码挡住了? [关闭]
【发布时间】:2023-04-06 02:37:01
【问题描述】:

我正在尝试在node.js + socket.io + mysql上做一个小游戏。

node.js 服务器读取有关字段及其上的项目的数据库信息(40x40)。它会自行保存这些信息,并根据要求提供。

问题是,如果你只是发送一个请求,信息就会来。但是,如果您在收到此信息后尝试对其进行处理,例如将扇区和对象放在数组中,则请求不起作用。我试图在函数之前设置一个超时,以便有时间获取信息;我试图把它放在一个按钮上。没有帮助。阻止一切的代码位于client.html 中,位于/**/ 之间。没有这段代码也很好用。

  • server.js:

    var mysql = require('mysql');
    var io = require('socket.io').listen(8080);
    var TESTGAME = 'testgame';
    var TABLES_MAP1 = 'map1';
    var client = mysql.createClient({
      user: 'root',
      password: '',
    });
    
    client.query('USE '+TESTGAME);
    
    client.query(
      ('SELECT * FROM '+TABLES_MAP1+' WHERE id_sector_x < 40 && id_sector_y < 40'),
      function(err, results, fields) {
        if (err) {throw err;}
    
        Map1 = (results);
    
      io.sockets.on('connection', function (socket) {
      socket.emit('info', Map1);
      socket.on('back', function (data) {
        console.log(data);
      });
    });
    
        client.end();
      }
    );
    
  • client.html:

    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Map</title>
        <script src="http://127.0.0.1:8080/socket.io/socket.io.js"></script>
        <script src="json.js" type="text/javascript"></script>
        <script type='text/javascript'>
        window.onload = function() {
            var socket = io.connect('http://127.0.0.1:8080');
    
            socket.on('info', function (data) {
                Mappp = (data);
                socket.emit('back', Mappp.length);
            });
        };
    
        Map1=Mappp;
        function mapp(){
            m=0; //As info looks like this [1600] i need to make it look like this [40][40]. So this m will be m++ on each iteration to know what info should be put in.
            for (x=0;x<40;x++){
                for (y=0;y<40;y++){
                    /*
                    switch (Map1[m].type_sector) {
                       case "grass":
                          map[x][y]=0;
                          [break]
                       case "water":
                          map[x][y]=1;
                          [break]
                       case "swamp":
                          map[x][y]=2;
                          [break]
                       default:
                          map[x][y]=0;
                          [break]
                    };
    
                    switch (Map1[m].obj_sector) {
                       case "no":
                          objectMap[x][y]=0;
                          [break]
                       case "wall":
                          objectMap[x][y]=1;
                          [break]
                       default:
                          objectMap[x][y]=0;
                          [break]
                    }; */
                    m++;
                                      }
                              }
            window.alert('Done');       }
        setTimeout(mapp, 1000);
    </script>
    <form name="">
        <input type="submit" value="call mapp"
        onclick=mapp()>
        </form>
    </head>
    <body>
    <script type="text/javascript">
    </script>
    </body>
    </html>
    

对不起我的英语:)

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    您正在处理一个异步请求。在请求返回并执行您的回调函数之前,您将无法设置Map1=Mappp;(旁注:请使用var 语句)。您可以通过超时来解决这个问题,但是因为mapp() 函数依赖于同步设置的Map1,即使请求已返回并且设置了Mapppmapp() 仍然会失败。

    要解决此问题,您需要确保在请求返回之前不会执行任何需要请求返回的数据的操作 - 这就是回调函数的用途。使用当前代码执行此操作的最简单方法可能是完全放弃 MapppMap1 变量,并将返回的数据作为函数参数传递给 mapp(),在回调中调用函数:

    socket.on('info', function (data) {
        socket.emit('back', data.length);
        mapp(data);
    });
    

    您需要调整 mapp() 函数才能使其工作:

    function mapp(Map1){
        // etc
    }
    

    【讨论】:

    • 谢谢!我还没有声望,但我稍后会投票))
    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 2013-01-09
    • 2014-11-12
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多