2010-02-14 2 views

ответ

5

Посмотрите пример Multithreaded Script Execution на странице Rhino Examples. В принципе, JavaScript не поддерживает потоки напрямую, но вы можете использовать поток Java для достижения того, что вы ищете.

36

Вы можете использовать java.util.Timer и java.util.TimerTask свернуть свой собственный набор/осветления Timeout и установить/очистить функции Интервал:

var setTimeout, 
    clearTimeout, 
    setInterval, 
    clearInterval; 

(function() { 
    var timer = new java.util.Timer(); 
    var counter = 1; 
    var ids = {}; 

    setTimeout = function (fn,delay) { 
     var id = counter++; 
     ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn}); 
     timer.schedule(ids[id],delay); 
     return id; 
    } 

    clearTimeout = function (id) { 
     ids[id].cancel(); 
     timer.purge(); 
     delete ids[id]; 
    } 

    setInterval = function (fn,delay) { 
     var id = counter++; 
     ids[id] = new JavaAdapter(java.util.TimerTask,{run: fn}); 
     timer.schedule(ids[id],delay,delay); 
     return id; 
    } 

    clearInterval = clearTimeout; 

})() 
+0

Уит ваш фрагмент кода, я был в состоянии работать жасмин тесты внутри Rhino без необходимости EnvJS. Благодаря! –

+0

Хотелось бы, чтобы я мог дать вам 100 upvotes, очень удивительный. Спасибо. – Upgradingdave

+2

Awesome. Благодаря! Чтобы быть полностью совместимым с браузерами, вам также необходимо справиться с отсутствием задержки. MDN говорит, что минимальная задержка по спецификации HTML5 составляет 4 мс, поэтому добавьте следующее: if (delay == null) {delay = 4; } –

2

Другой версии с помощью ScheduledThreadPoolExecutor, совместимый с Rhino 1.7R4 и предложенный @Nikita-Beloglazov:

var setTimeout, clearTimeout, setInterval, clearInterval; 

(function() { 
    var executor = new java.util.concurrent.Executors.newScheduledThreadPool(1); 
    var counter = 1; 
    var ids = {}; 

    setTimeout = function (fn,delay) { 
     var id = counter++; 
     var runnable = new JavaAdapter(java.lang.Runnable, {run: fn}); 
     ids[id] = executor.schedule(runnable, delay, 
      java.util.concurrent.TimeUnit.MILLISECONDS); 
     return id; 
    } 

    clearTimeout = function (id) { 
     ids[id].cancel(false); 
     executor.purge(); 
     delete ids[id]; 
    } 

    setInterval = function (fn,delay) { 
     var id = counter++; 
     var runnable = new JavaAdapter(java.lang.Runnable, {run: fn}); 
     ids[id] = executor.scheduleAtFixedRate(runnable, delay, delay, 
      java.util.concurrent.TimeUnit.MILLISECONDS); 
     return id; 
    } 

    clearInterval = clearTimeout; 

})() 

Ссылка: https://gist.github.com/nbeloglazov/9633318