【问题标题】:setTimeout not functioning as xpected?setTimeout 没有按预期运行?
【发布时间】:2013-04-03 11:48:50
【问题描述】:

我正在使用 socket.io 将一些数据连续地从服务器发送到客户端。所以我使用setTimeout函数定期发送数据,并且睡眠时间不是恒定的所以我没有使用setInterval,但setTimeout不起作用。我正在使用服务总线从我的工作角色获取一些数据,这些数据会定期转发给客户端。这是我的代码:

var sleepTime;

function requestQueue() {

sleepTime = 0;

console.log("REQUEST QUEUE STARTED");

console.log("SEND to WORKER ROLE");
// send the request to worker role
var broadcastMessage = {}
broadcastMessage.Channel = "World";
broadcastMessage.BufferSize = 10;     

sendMessage(socketToWorkerRole, broadcastMessage)

receivePeriodicRecordsQueue(workerRoleToSocket);
}

////

function receivePeriodicRecordsQueue(queue) {

serviceBusService.receiveQueueMessage(queue, function (error, receivedMessage) {
    if (!error) {
        if (receivedMessage != null) {
            var messageBody = receivedMessage.body;

            if (messageBody != null) {

                // Lots of processing and calculating sleep time
                  
                    // SET TIMEOUT
                    if (sleepTime != 0) {
                        console.log("SLEEP TIME:" + sleepTime);
                        setTimeout(function () { requestQueue(); }, sleepTime);
                    }

                      // sending data to client through socket
                    io.sockets.emit('broadcast', recordsQueue);

                }

            }
        }
    }
    else {
        console.log(error);
    }
})

}

我基本上是一名 C# 程序员,对 JS 非常陌生。如果我对setTimeout 的实现有误,请告诉我。本质上,我希望使用可变的睡眠时间定期调用 requestQueue 方法

编辑答案:

就我而言,这是一个愚蠢的问题。我以秒为单位使用睡眠时间而不是毫秒。 setTimeout 需要毫秒。我已将 Scott 标记为答案,因为我认为 async 模块非常有用,可以用作 setTimeout 的替代品,如果需要,还可以用作许多其他功能。

【问题讨论】:

    标签: node.js azure dom-events settimeout setinterval


    【解决方案1】:

    看起来您可以从应用中的某些控制流中受益。

    看看异步模块。这很简单,无需使用 setTimeout。

    https://github.com/caolan/async

    【讨论】:

    • 太棒了!看起来我可以利用这个,你知道我需要使用什么函数来复制 setTimeout 行为吗?
    • 等等!假设如果我使用异步模块中的任何“永远”或“同时”,那么我的执行控制会卡在其中,对吗?我的意思是客户端将向套接字发出请求,所以我不希望这些请求因为执行控制卡在“forerver”方法中而被停止。
    • 我会使用队列对象: queue(worker, concurrency) 创建具有指定并发性的队列对象。添加到队列的任务将被并行处理(直到并发限制)。如果所有工作人员都在进行中,则任务将排队,直到有一个可用。一旦工作人员完成了一项任务,就会调用该任务的回调。
    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多