在从文件读取时触发向客户端发送JSON数据

时间:2011-06-10 23:19:49

标签: node.js

我想要使用node.js读取日志文件(大小为1-2 MB)。感谢这个论坛的帮助,我使用的是:

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

sendData函数本质上是一个解析器,使用一个开关,逐行收集日志文件中的数据。以下是sendData函数中该解析器的片段:

    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,但所有这一切都是playbackSpeed间隔的延迟,并将所有数据一次性发送到客户端。我确信这是一个I / O阻塞问题但是,我似乎可以从中挖掘出来。

1 个答案:

答案 0 :(得分: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);