Prototype PeriodicalExecuter对象 学习

  This is a simple facility for periodical execution of a function. This essentially encapsulates the native clearInterval/setInterval mechanism found in native Window objects.

  This is especially useful if you use one to interact with the user at given intervals (e.g. use a prompt or confirm call): this will avoid multiple message boxes all waiting to be actioned.

  这个对象就是可以周期性的执行某个方法,但是在它内部维持了一个状态,可以防止由于某些原因一次调用没执行,然后下一次调用又来了,这样会造成连续执行两次方法。上面的第二断英文就是这个意思。

  帮助文档上说这个对象只提供了一个方法stop,但是在我看的源码里还提供了一个事件onTimerEvent,应该可以在某个时候触发这个事件。但帮助文档上没有给出示例。

  这个对象源码比较简单,这里直接贴出来了,就不再注释了:

  

复制代码 代码如下:

  var PeriodicalExecuter = Class.create({

  initialize: function(callback, frequency) {

  this.callback = callback;

  this.frequency = frequency;

  this.currentlyExecuting = false;

  this.registerCallback();

  },

  registerCallback: function() {

  this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);

  },

  execute: function() {

  this.callback(this);

  },

  stop: function() {

  if (!this.timer) return;

  clearInterval(this.timer);

  this.timer = null;

  },

  onTimerEvent: function() {

  if (!this.currentlyExecuting) {

  try {

  this.currentlyExecuting = true;

  this.execute();

  } catch(e) {

  /* empty catch for clients that don't support try/finally */

  }

  finally {

  this.currentlyExecuting = false;

  }

  }

  }

  });

  看一下示例:

  

复制代码 代码如下:

  new PeriodicalExecuter(function(pe) {

  if (!confirm('Want me to annoy you again later?'))

  pe.stop(); },

  5);

  // Note that there won't be a stack of such messages if the user takes too long

  // answering to the question...