delay.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Provides time-based promise-returning delay and schedule functions for Rhino
  3. */
  4. var defer = require("../../promise").defer,
  5. LazyArray = require("../../lazy-array").LazyArray;
  6. // returns a promise that is fulfilled after the given number of milliseconds
  7. exports.delay = function(ms){
  8. var deferred = defer();
  9. _scheduleTimeout(deferred.resolve, ms, false);
  10. return deferred.promise;
  11. };
  12. // returns a lazy array that iterates one every given number of milliseconds
  13. exports.schedule = function(ms){
  14. var callbacks = [];
  15. _scheduleTimeout(function(){
  16. callbacks.forEach(function(callback){
  17. if(callback()){
  18. callbacks.splice(callbacks.indexOf(callback), 1);
  19. }
  20. });
  21. }, ms, true);
  22. return LazyArray({
  23. some: function(callback){
  24. callbacks.push(callback);
  25. }
  26. });
  27. };
  28. var nextId = 1,
  29. timeouts = {},
  30. timer,
  31. queue;
  32. var _scheduleTimeout = function(callback, delay, repeat)
  33. {
  34. if (typeof callback == "function")
  35. var func = callback;
  36. else if (typeof callback == "string")
  37. var func = new Function(callback);
  38. else
  39. return;
  40. var timeout = {
  41. };
  42. var id = nextId++;
  43. timeouts[id] = timeout;
  44. timer = timer || new java.util.Timer("JavaScript timer thread", true);
  45. queue = queue || require("event-loop");
  46. var lastFinished = true;
  47. var task = timeout.task = new java.util.TimerTask({
  48. run: function(){
  49. if(lastFinished){
  50. lastFinished = false;
  51. queue.enqueue(function(){
  52. if(!timeout.cancelled){ // check to make sure it wasn't enqueued and then later cancelled
  53. try{
  54. func();
  55. }finally{
  56. lastFinished = true;
  57. }
  58. }
  59. });
  60. }
  61. }
  62. });
  63. delay = Math.floor(delay);
  64. if(repeat){
  65. timer.schedule(task, delay, delay);
  66. }
  67. else{
  68. timer.schedule(task, delay);
  69. }
  70. return id;
  71. }