JavaScript で定期タスクを発行する

function CronTask(task, interval, isDecay) {
  this.task = task;
  this.isDecay = isDecay;
  this.interval = interval;
  this.decayRate = 1;
  this.decayMultiplier = 1.5;
  this.maxDecayTime = 5 * 60 * 1000; // 3 minutes
}

CronTask.prototype = {

  start: function() {
    this.stop().run();
    return this;
  },

  stop: function() {
    if (this.worker) {
      window.clearTimeout(this.worker);
    }
    return this;
  },

  run: function() {
    var cronTask = this;
    this.task(function() {
      cronTask.decayRate = cronTask.isDecay ? Math.max(1, cronTask.decayRate / cronTask.decayMultiplier) : cronTask.decayRate * cronTask.decayMultiplier;
      var expire = cronTask.interval * cronTask.decayRate;
      if(!cronTask.isDecay) {
          expire = (expire >= cronTask.maxDecayTime) ? cronTask.maxDecayTime : expire;
      }
      expire = Math.floor(expire);
      cronTask.worker = window.setTimeout(
          function () {
            cronTask.run.call(cronTask);
          },
          expire);
    });
  },

  reset: function() {
    this.destroy().run();
    return this;
  },

  destroy: function() {
    this.stop();
    this.decayRate = 1;
    return this;
  }
};

使い方

// 定期実行したい関数
function test(decay) { console.log("test");decay(); };
// オブジェクトの作成
// 関数、期間、遅延実行するかどうか
var task = new CronTask(test,1000,true);
// 定期タスクの開始
task.start();
// 定期タスクの停止
task.stop();