2016-04-14 11 views
0

私はnode.jsサーバーを作成しました。テーブルからブラウザにデータを送信しようとしています(javascriptクライアントがデータを受け取っています)。ソケットio接続を介して1秒あたり1行のSQLローを送信するには?

私の問題は、テーブルからすべての行を送信したい場合、正常に動作しますが、1秒間に1行しか送信しない場合、動作しません。

これは私がやっているものです: サーバー側:

io.on('connection', function (socket) { 

    for (var i = 1; i < 60; i++) { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
     // Push results onto the notes array 
     var a= JSON.stringify(data); 
     notes.push(a); //I want to save each line in an array notes 

     setTimeout(function() { 
     socket.emit('news', notes[i]); 
     console.log(a); 
     }, (1 * 1000)); 
    }); 
    } 

}); 

だからbasicaly私は各行ごとに異なっており、私のテーブルのidを持っているが、forループ内の行を選択しています。 Settimeoutは、クエリーが完了してから1秒後にsocket.emit()がデータを送信するように1秒の遅延を行います。

しかし、console.log(a)はすべての行をimidiatellyで印刷します。

私は間違っていますか? ありがとうございます。

+0

あなたが任意の例外をGATますか? – Tomasito665

+0

@ Tomasito665、いいえ、コードが動作します。問題は、関数の中で 'console.log(a)'を実行すると、私のテーブルのすべての値が直ちに1秒遅れなく取得されるということです。 私はそれを私の質問に含めます。 –

+0

これであなたのコードを置き換えることができます:http://pastebin.com/e8EvP5rV 'console.log(endTime - startTime);'出力は何ですか?ちょうどsetTimeoutが機能するかどうか不思議です。 – Tomasito665

答えて

0

jsは非同期であることに常に注意する必要があります。

つまり、setTimeout呼び出し後にループfor(var i=1;i<60;i++){がループし続けることを意味します。

遅延を取得するには、次回の呼び出しで前回の処理が完了するまで待つ必要があります。

あなただけの違いを参照して、この試みを試すことができます。

var i = 60; 
myFunc = function(socket) { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
      var a= JSON.stringify(data); 
      notes.push(a); 

      socket.emit('news',notes[i]); 
      console.log(a); 

      i--; 
      console.log(i); 
      dt = new Date(); 
      console.log(dt.getMinutes()+':'+dt.getSeconds()); 
      if (i > 0) { 
       setTimeout(function(){myFunc(socket);}, 1000); 
      } 
    }); 

} 

io.on('connection', function (socket) { 
    myFunc(socket); 
}); 

別のアプローチ

var i = 60; 
var mySocket=''; 
myFunc = function() { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
      var a= JSON.stringify(data); 
      notes.push(a); 

      mySocket.emit('news',notes[i]); 
      console.log(a); 

      i--; 
      console.log(i); 
      dt = new Date(); 
      console.log(dt.getMinutes()+':'+dt.getSeconds()); 
      if (i > 0) { 
       setTimeout(function(){myFunc();}, 1000); 
      } 
    }); 

} 


io.on('connection', function (socket) { 
    mySocket = socket; 
    myFunc(); 
}); 
+0

アレックスありがとう。私はあなたが正しい軌道に乗っていると思うが、 'myFunc'で気付いた場合、' socket'は定義されていないので、あなたが書いたように動作しません。私はそれを試して修正します。 –

+0

だから、ちょうどソケットとして – Alex

+0

をソケットに追加しましたが残念ながらコンソールには何も印刷されません –

0

ための非同期リクエストのを、すべての60個のクエリは同じで約行われ(DB接続とコンピューティングがうまくいっていると仮定します)。

これを試してみてください:

io.on('connection', function (socket) { 

    for (var i = 1; i < 60; i++) { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
     // Push results onto the notes array 
     var a= JSON.stringify(data); 
     notes.push(a); //I want to save each line in an array notes 

     setTimeout(function() { 
     socket.emit('news', a); // variable 'i' will be 60, you should use variable 'a' directly     
     console.log(a); 
     }, (i * 1000)); 
    }); 
    } 

}); 
関連する問題