2011-06-10 81 views
0

我有要使用node.js讀取的日誌文件(大小爲1-2 MB)。感謝幫助在這個論壇上,我使用的東西,如:將JSON數據發送到從文件讀取時觸發的客戶端

new lazy(fs.createReadStream(clientMessage.selectedFile)) 
.lines 
.forEach(function(line){ 
sendData(line,client,playBackSpeed);}); 

的發送數據的功能本質上是一個分析器,使用開關,通過線收集從日誌文件中的數據,行。以下是在送出數據功能解析器的一個片段:

switch (lineTokens[0]) //first token is the command idenitifier 
    { 
     case "$F":{ // heartbeat signal 
       var elapspedTimeIndex = 4, flagIndex = 5; 
       var heartBeat = "{\"heartBeat\": {\"elapsedTime\":"+ lineTokens[elapspedTimeIndex].trim() +", \"flag\":"+ lineTokens[flagIndex].trim() + "}}"; 
       var now = new Date().getTime(); 
       while(new Date().getTime() <= now + playBackSpeed) {} //sleep before we move on 
       client.send(heartBeat); 
      } 
      return; 
     } 
} 

我什麼將數據發送定期,說1之間 - 5秒。在客戶端UI中,有一種方法可以改變所需的播放速度。上面的代碼工作正常,但我無法更改此文件流啓動後playBackSpeed的值。我使用socket.io做消息交換,並且工作正常。看起來造成延遲的while循環阻止了客戶端/服務器交換。我嘗試過放入setTimeout,但是所做的只是延遲播放間隔,並一次將所有數據發送到客戶端。我確信這是一個I/O阻塞問題,但我似乎可以從中發現這一點。

回答

0

推送數據到FIFO緩衝器,並使用計時器事件

switch (lineTokens[0]) //first token is the command idenitifier 
    { 
     case "$F":{ // heartbeat signal 
       var elapspedTimeIndex = 4, flagIndex = 5; 
       var heartBeat = "{\"heartBeat\": {\"elapsedTime\":"+ lineTokens[elapspedTimeIndex].trim() +", \"flag\":"+ lineTokens[flagIndex].trim() + "}}"; 
       client.queue.add(heartBeat); 
      } 
      return; 
     } 
} 

function checkQueue() 
{ 
    var msg = client.queue.pop(); 
    if (!msg) return; 
    client.send(msg); 
} 

function setSpeed(newSpeed) 
{ 
    if (timerID) 
     clearInterval(timerID); 
    timerID = setInterval(checkQueue, playBackSpeed); 
} 

setSpeed(playBackSpeed); 
發送它
相關問題