1

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ミリ秒が必要です。setTimeoutasync モジュールは非常に便利で、必要に応じて他の多くの機能の代わりとして使用できると考えたため、Scott を回答としてマークしました。

4

1 に答える 1

1

アプリの制御フローからメリットが得られるようです。

async モジュールを見てください。これは簡単で、setTimeout を使用する必要がなくなります。

https://github.com/caolan/async

于 2013-04-03T12:12:20.933 に答える