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.
63 lines
1.3 KiB
63 lines
1.3 KiB
'use strict' |
|
|
|
var assert = require('assert') |
|
|
|
function Retimer (callback, timeout, args) { |
|
var that = this |
|
|
|
this._started = getTime() |
|
this._rescheduled = 0 |
|
this._scheduled = timeout |
|
this._args = args |
|
|
|
this._timer = setTimeout(timerWrapper, timeout) |
|
|
|
function timerWrapper () { |
|
if (that._rescheduled > 0) { |
|
that._scheduled = that._rescheduled - (getTime() - that._started) |
|
that._timer = setTimeout(timerWrapper, that._scheduled) |
|
that._rescheduled = 0 |
|
} else { |
|
callback.apply(null, that._args) |
|
} |
|
} |
|
} |
|
|
|
Retimer.prototype.reschedule = function (timeout) { |
|
var now = getTime() |
|
if ((now + timeout) - (this._started + this._scheduled) < 0) { |
|
return false |
|
} else { |
|
this._started = now |
|
this._rescheduled = timeout |
|
return true |
|
} |
|
} |
|
|
|
Retimer.prototype.clear = function () { |
|
clearTimeout(this._timer) |
|
} |
|
|
|
function retimer () { |
|
assert.equal(typeof arguments[0], 'function', 'callback needed') |
|
assert.equal(typeof arguments[1], 'number', 'timeout needed') |
|
|
|
var args |
|
|
|
if (arguments.length > 0) { |
|
args = new Array(arguments.length - 2) |
|
|
|
for (var i = 0; i < args.length; i++) { |
|
args[i] = arguments[i + 2] |
|
} |
|
} |
|
|
|
return new Retimer(arguments[0], arguments[1], args) |
|
} |
|
|
|
function getTime () { |
|
var t = process.hrtime() |
|
return Math.floor(t[0] * 1000 + t[1] / 1000000) |
|
} |
|
|
|
module.exports = retimer
|
|
|