12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- * Provides time-based promise-returning delay and schedule functions for Rhino
- */
- var defer = require("../../promise").defer,
- LazyArray = require("../../lazy-array").LazyArray;
- // returns a promise that is fulfilled after the given number of milliseconds
- exports.delay = function(ms){
- var deferred = defer();
- _scheduleTimeout(deferred.resolve, ms, false);
- return deferred.promise;
- };
- // returns a lazy array that iterates one every given number of milliseconds
- exports.schedule = function(ms){
- var callbacks = [];
- _scheduleTimeout(function(){
- callbacks.forEach(function(callback){
- if(callback()){
- callbacks.splice(callbacks.indexOf(callback), 1);
- }
- });
- }, ms, true);
- return LazyArray({
- some: function(callback){
- callbacks.push(callback);
- }
- });
- };
- var nextId = 1,
- timeouts = {},
- timer,
- queue;
- var _scheduleTimeout = function(callback, delay, repeat)
- {
- if (typeof callback == "function")
- var func = callback;
- else if (typeof callback == "string")
- var func = new Function(callback);
- else
- return;
- var timeout = {
- };
- var id = nextId++;
- timeouts[id] = timeout;
- timer = timer || new java.util.Timer("JavaScript timer thread", true);
- queue = queue || require("event-loop");
- var lastFinished = true;
- var task = timeout.task = new java.util.TimerTask({
- run: function(){
- if(lastFinished){
- lastFinished = false;
- queue.enqueue(function(){
- if(!timeout.cancelled){ // check to make sure it wasn't enqueued and then later cancelled
- try{
- func();
- }finally{
- lastFinished = true;
- }
- }
- });
- }
- }
- });
- delay = Math.floor(delay);
- if(repeat){
- timer.schedule(task, delay, delay);
- }
- else{
- timer.schedule(task, delay);
- }
- return id;
- }
|