welsonjs/lib/timer.js

112 lines
3.1 KiB
JavaScript

/*
Windows Scripting Host doesn't provide setTimeout and clearTimeout.
This serves as a replacement.
To use:
Set up all the deferred actions you like with the usual setTimeout calls
setTimeout(function() {
// do something
}, 200);
Then call setTimeout.queue.run().
Deferred actions can spawn more deferred actions.
If the queue ever runs dry, it will stop running and return.
Remember, javascript is single-threaded. If you put more
functions in the queue, call the run method again.
*/
exports.VERSIONINFO = "Timer Module (timer.js) version 0.1";
exports.global = global;
exports.require = global.require;
exports.sleep = function(ms, callback) {
WScript.Sleep(ms);
if(typeof(callback) == "function") {
callback();
}
};
exports.setTimeout = function(func, delay) {
var when = new Date().getTime() + delay;
return exports.setTimeout.queue.add(func, when);
};
exports.clearTimeout = function(timer) {
exports.setTimeout.queue.del(timer);
};
// A queue object, with methods add, del, run.
// Tied to setTimeout to keep it out of the global namespace.
exports.setTimeout.queue = (function() {
var store = [];
var nextid = 0;
return {
add: function(func, when) {
store.push({
id: nextid,
func: func,
when: when
});
return nextid++;
},
del: function(id) {
for (var i = 0; i < store.length; i++) {
if (store[i].id == id) {
store.splice(i, 1);
}
}
},
run: function() {
while (store.length > 0) {
var now = new Date().getTime();
for (var i = 0; i < store.length; i++) {
var item = store[i];
if (now > item.when) {
exports.setTimeout.queue.del(item.id);
item.func(); // <---- actually invoke the function here
// Note: we can't continue looping through the queue here,
// because we removed one of the items. The loop limit is
// now incorrect. Easiest thing to do is restart the loop.
break;
}
// We burn a millisecond here to throttle the looping.
// Otherwise it will loop on the order of 200,000 times per sec.
exports.sleep(1);
}
}
}
}
})();
exports.setTimeout.test = function() {
console.log('You should see: C,A,D,N,M');
exports.setTimeout(console.log('A'), 500);
var b = setTimeout(console.log('B'), 1220);
exports.setTimeout(console.log('C'), 300);
exports.setTimeout(console.log('D'), 1000);
clearTimeout(b);
exports.setTimeout(function() {
console.log('N');
exports.setTimeout(function() {
console.log('M');
}, 100)
}, 1300);
exports.setTimeout.queue.run();
console.log('done');
};
///// setTimeout.test(); // uncomment to run test