Javascript 为什么这个JS代码会被几行简单的代码阻塞?

Javascript 为什么这个JS代码会被几行简单的代码阻塞?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我想在node.js+socket.io+mysql上做一个小游戏 node.js服务器读取有关字段及其项的数据库信息(40x40)。该信息由它自己保存,并根据要求提供 问题是,如果你只是发送一个请求,信息就来了。但是,如果您试图在这些信息出现后对其进行处理,例如将扇区和对象放在数组中,请求将不起作用。我试图在函数前设置一个超时,以便有时间获取信息;我试着把它挂在按钮上。没有帮助。阻止一切的代码位于client.html中,介于/*和*/之间。没有这个代码,它工作得很好 server.js:

我想在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();
      }
    );
    

对不起,我的英语是:)

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

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

socket.on('info', function (data) {
    socket.emit('back', data.length);
    mapp(data);
});
您需要调整
mapp()
函数才能使其工作:

function mapp(Map1){
    // etc
}

非常感谢。我还没有名气,但我以后会投赞成票的
function mapp(Map1){
    // etc
}