diff --git a/lib/fakeworker.js b/lib/fakeworker.js index 1b42be0..1ccd855 100644 --- a/lib/fakeworker.js +++ b/lib/fakeworker.js @@ -80,37 +80,51 @@ function FakeWorker() { }); return this.__lastIntervalID__; }; + - this.getIntervals = function() { + this.getIntervals = function(cur) { var intervals = []; - var cur = Date.now(); for (var i = 0; i < this.__intervals__.length; i++) { - if (!this.__intervals__[i].cleared && (this.__intervals__[i].timestamp + this.__intervals__[i].delay) >= cur) { - intervals.push(this.__intervals__[i]); - this.__intervals__[i].timestamp = cur; - if (typeof this.__intervals__[i].callback === "function") { - this.__intervals__[i].delay = this.__intervals__[i].callback(); - } + var work = this.__intervals__[i]; + + if (!work.cleared && (work.timestamp + work.delay) <= cur) { + //console.debug("timestamp:", work.timestamp); + //console.debug("delay:", work.delay); + //console.debug("timestamp+delay:", work.timestamp + work.delay); + //console.debug("cur:", cur); + //console.debug("cur-(timestamp+delay):", cur - (work.timestamp + work.delay)); + intervals.push([i, work]); } - cur = Date.now(); } return intervals; }; - this.getTimeouts = function() { + this.update = function(i, timestamp) { + var work = this.__intervals__[i]; + + work.timestamp = timestamp; + if (typeof work.callback === "function") { + work.delay = work.callback(); + } + + this.__intervals__[i] = work; + }; + + this.getTimeouts = function(cur) { var timeouts = []; - var cur = Date.now(); for (var i = 0; i < this.__timeouts__.length; i++) { - if (!this.__timeouts__[i].cleared && (this.__timeouts__[i].timestamp + this.__timeouts__[i].delay) >= cur) { - timeouts.push(this.__timeouts__[i]); - this.__timeouts__[i].cleared = true; + var work = this.__intervals__[i]; + + if (!work.cleared && (work.timestamp + work.delay) <= cur) { + timeouts.push([i, work]); + work.cleared = true; + this.__timeouts__[i] = work; } - cur = Date.now(); } - + return timeouts; }; } @@ -128,15 +142,23 @@ exports.repeat = function(target, worker, onError) { var end = cur + ms; while (ms === true ? true : (cur < end)) { - var intervals = worker.getIntervals(); + var intervals = worker.getIntervals(cur); for (var i = 0; i < intervals.length; i++) { + var k = intervals[i][0]; + var work = intervals[i][1]; + try { - if (typeof intervals[i].code === "function") intervals[i].code(i); + if (typeof work.code === "function") { + work.code(i); + worker.update(k, Date.now()); + } } catch (e) { - if (typeof onError === "function") onError(e, i); + if (typeof onError === "function") { + onError(e, i); + } } - cur = Date.now(); }; + cur = Date.now(); } end = cur; @@ -145,7 +167,7 @@ exports.repeat = function(target, worker, onError) { return end; }; -exports.VERSIONINFO = "FakeWorker module (fakeworker.js) version 0.0.4"; +exports.VERSIONINFO = "FakeWorker module (fakeworker.js) version 0.0.6"; exports.AUTHOR = "abuse@catswords.net"; exports.global = global; exports.require = global.require;