Search code examples
javascriptnode.jssleepblockingtimedelay

How to create a sleep/delay in nodejs that is Blocking?


I'm currently trying to learn nodejs and a small project I'm working is writing an API to control some networked LED lights.

The microprocessor controlling the LEDs has a processing delay, and I need to space commands sent to the micro at least 100ms apart. In C# I'm used to just calling Thread.Sleep(time), but I have not found a similar feature in node.

I have found several solutions using the setTimeout(...) function in node, however, this is asynchronous and does not block the thread ( which is what I need in this scenario).

Is anyone aware of a blocking sleep or delay function? Preferably something that does not just spin the CPU, and has an accuracy of +-10 ms?


Solution

  • The best solution is to create singleton controller for your LED which will queue all commands and execute them with specified delay:

    function LedController(timeout) {
      this.timeout = timeout || 100;
      this.queue = [];
      this.ready = true;
    }
    
    LedController.prototype.send = function(cmd, callback) {
      sendCmdToLed(cmd);
      if (callback) callback();
      // or simply `sendCmdToLed(cmd, callback)` if sendCmdToLed is async
    };
    
    LedController.prototype.exec = function() {
      this.queue.push(arguments);
      this.process();
    };
    
    LedController.prototype.process = function() {
      if (this.queue.length === 0) return;
      if (!this.ready) return;
      var self = this;
      this.ready = false;
      this.send.apply(this, this.queue.shift());
      setTimeout(function () {
        self.ready = true;
        self.process();
      }, this.timeout);
    };
    
    var Led = new LedController();
    

    Now you can call Led.exec and it'll handle all delays for you:

    Led.exec(cmd, function() {
      console.log('Command sent');
    });