为什么这个JS代码被一些简单的代码阻塞?

时间:2011-12-07 23:51:23

标签: javascript node.js socket.io

我试图在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>
    

对不起我的英文:)

1 个答案:

答案 0 :(得分: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
}