Event based interface to setTimeout and setInterval.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

65 lines
1.8 KiB

var event = require('eventemitter2').EventEmitter2;
var util = require('util');
var continuous = function( options ){
options = (options)?options:{};
this.limit = (options.limit)?parseInt(options.limit):-1;
this.time = (options.time)?parseInt(options.time):1000;
this.minTime = (options.minTime)?parseInt(options.minTime):0;
this.maxTime = (options.maxTime)?parseInt(options.maxTime):1000;
this.random = (options.random)?options.random==true:false;
this.callback = (typeof(options.callback)=='function')?options.callback:function(){};
this._interval = null;
this._timeout = null;
this._count = 0;
this._running = false;
};
util.inherits(continuous, event);
continuous.prototype.stop = function(){
this._running = false;
clearInterval(this._interval);
clearTimeout(this._timeout);
this.emit('stopped');
};
continuous.prototype.start = function(){
this._count = 0;
this._running = true;
this._run();
this.emit('started');
};
continuous.prototype._run = function(){
if( !this._running ) return;
var self = this;
if( this.random ){
this._timeout = setTimeout( function(){
var result = self.callback();
++self._count;
self.emit('complete', self._count, result);
if( self._count == self.limit ) self.stop();
self._run();
}, self.randomNumber(self.minTime,self.maxTime) );
} else{
this._interval = setInterval( function(){
var result = self.callback();
++self._count;
self.emit('complete', self._count, result);
if( self._count == self.limit ) self.stop();
}, self.time );
}
};
continuous.prototype.randomNumber = function(min,max){
return Math.floor( Math.random()*(max-min)+1 ) + min;
};
module.exports = continuous;