2011-12-07 9 views
0

私はnode.js + socket.io + mysqlで小さなゲームを作ろうとしています。なぜこのJSコードがいくつかの単純なコード行でブロックされていますか?

node.jsサーバーは、フィールドとそのアイテムに関するデータベース情報(40x40)を読み取ります。この情報はそれ自身を保持し、要求に応じて提供します。

問題は、単純にリクエストを送信すると情報が表示されることです。しかし、セクタやオブジェクトを配列に入れたりするなど、この情報が入ってから何かをしようとすると、要求しません。私は情報を取得する時間を許可する関数の前にタイムアウトを入れようとしました。私はボタンにそれを置こうとしました。助けてくれなかった。すべてをブロックするコードはで、/**/の間です。このコードなしでうまく動作します。

  • 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

あなたが非同期リクエストを扱っています。要求が返され、コールバック関数が実行されるまで()設定することはできません(脇に:varステートメントを使用してください)。これはあなたのタイムアウトに合わせて処理しますが、mapp()機能はMap1が同期設定されているため、要求が返されてもMapppが設定されていても、まだ失敗します。mapp()

これを修正するには、リクエストによって返されるデータが必要なものが、リクエストが返されるまで実行されないようにする必要があります。これがコールバック関数の目的です。あなたの現在のコードでこれを行うための最も簡単な方法は、コールバックで関数を呼び出す、完全にMapppMap1変数を省略し、関数の引数としてmapp()に返されたデータを渡すために、おそらくです:

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

あなたと思います

function mapp(Map1){ 
    // etc 
} 
+0

ありがとうございます:mapp()機能を調整する必要があります!私はまだ評判はないが、後で投票する)) – user1086671

関連する問題