82 lines
2.8 KiB
JavaScript
Executable File
82 lines
2.8 KiB
JavaScript
Executable File
// Mock setTimeout, clearTimeout
|
|
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
|
|
|
|
var Clock = {
|
|
timeoutsMade: 0,
|
|
scheduledFunctions: {},
|
|
nowMillis: 0,
|
|
reset: function() {
|
|
this.scheduledFunctions = {};
|
|
this.nowMillis = 0;
|
|
this.timeoutsMade = 0;
|
|
},
|
|
tick: function(millis) {
|
|
var oldMillis = this.nowMillis;
|
|
var newMillis = oldMillis + millis;
|
|
this.runFunctionsWithinRange(oldMillis, newMillis);
|
|
this.nowMillis = newMillis;
|
|
},
|
|
runFunctionsWithinRange: function(oldMillis, nowMillis) {
|
|
var scheduledFunc;
|
|
var funcsToRun = [];
|
|
for (var timeoutKey in this.scheduledFunctions) {
|
|
scheduledFunc = this.scheduledFunctions[timeoutKey];
|
|
if (scheduledFunc != undefined &&
|
|
scheduledFunc.runAtMillis >= oldMillis &&
|
|
scheduledFunc.runAtMillis <= nowMillis) {
|
|
funcsToRun.push(scheduledFunc);
|
|
this.scheduledFunctions[timeoutKey] = undefined;
|
|
}
|
|
}
|
|
|
|
if (funcsToRun.length > 0) {
|
|
funcsToRun.sort(function(a, b) {
|
|
return a.runAtMillis - b.runAtMillis;
|
|
});
|
|
for (var i = 0; i < funcsToRun.length; ++i) {
|
|
try {
|
|
this.nowMillis = funcsToRun[i].runAtMillis;
|
|
funcsToRun[i].funcToCall();
|
|
if (funcsToRun[i].recurring) {
|
|
Clock.scheduleFunction(funcsToRun[i].timeoutKey,
|
|
funcsToRun[i].funcToCall,
|
|
funcsToRun[i].millis,
|
|
true);
|
|
}
|
|
} catch(e) {
|
|
}
|
|
}
|
|
this.runFunctionsWithinRange(oldMillis, nowMillis);
|
|
}
|
|
},
|
|
scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
|
|
Clock.scheduledFunctions[timeoutKey] = {
|
|
runAtMillis: Clock.nowMillis + millis,
|
|
funcToCall: funcToCall,
|
|
recurring: recurring,
|
|
timeoutKey: timeoutKey,
|
|
millis: millis
|
|
};
|
|
}
|
|
};
|
|
|
|
function setTimeout(funcToCall, millis) {
|
|
Clock.timeoutsMade = Clock.timeoutsMade + 1;
|
|
Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, false);
|
|
return Clock.timeoutsMade;
|
|
}
|
|
|
|
function setInterval(funcToCall, millis) {
|
|
Clock.timeoutsMade = Clock.timeoutsMade + 1;
|
|
Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, true);
|
|
return Clock.timeoutsMade;
|
|
}
|
|
|
|
function clearTimeout(timeoutKey) {
|
|
Clock.scheduledFunctions[timeoutKey] = undefined;
|
|
}
|
|
|
|
function clearInterval(timeoutKey) {
|
|
Clock.scheduledFunctions[timeoutKey] = undefined;
|
|
}
|