2011-12-07 68 views
0

我試圖在node.js + socket.io + mysql上做一個小遊戲。爲什麼這個JS代碼被幾行簡單的代碼阻塞了?

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

你處理異步請求。在請求返回並執行回調函數之前,您將無法設置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 
} 
+0

謝謝!我沒有聲望,但我會稍後投票))) – user1086671

相關問題