• Blog
  • Archives
  • Code
  • Talks
  • About

Clockmaker, flexible timer management for Javascript

Note: This post is over 6 months old and may now be out of date. Some of the links not work anymore.

(1 minute read)

As part of my tests for Ansibot I need to be able to shutdown and startup the server multiple times in succession. This involves stopping and starting various timers spread throughout the system. I was using setTimeout and setInterval directly (Javascript's built-in goodies) to create my timers, and this made it hard to control the timers once they were running. After a quick fruitless search around for a nice library that would make this easier I decided to build Clockmaker, my solution to this.

Clockmaker allows you to start and stop a timer multiple times, change the timer interval in real-time, and control multiple timers in one go. Here are some examples...

A basic timer which ticks once and execute the handler after 2 seconds:

Timer(function() {  
  console.log('2 seconds done');  
}, 2000).start();  

A repeating timer (like setInterval) which has its delay adjusted on-the-fly:

var delayMs = 1000;
var timer = new Timer(function() {
  console.log('1 second longer');
  delayMs += 1000;
}, delayMs, {
  repeat: true

A repeating timer that stops after two ticks:

var count = 0;
var timer = new Timer(function() {
  if (2 === count) {
}, 1000, {
  repeat: true

A timer with an asynchronous handler function, a custom this context and also error handling:

var ctx = { str: 'hello' };
var timer = new Timer(function(cb) {
  console.log(this.str);  // 'hello'
  cb(new Error('test'));
}, 1000, {
  async: true,
  this: ctx,
  onError: function(err) {
    console.log(err);  // 'Error: test'

Control multiple timers:

var timers = new Timers();
var timer1 = timers.new(handlerFn, 2000, { repeat: true });
var timer2 = timers.new(aletFn, 1000);
var timer3 = ...
timers.start(); // ...start them all at once
... // some time later
timers.stop(); // ...stop them all at once

A full list of features, installation instructions and a more complete list of examples is available at https://github.com/hiddentao/clockmaker.