2010-02-14 17 views

Respuesta

5

Eche un vistazo al ejemplo Multithreaded Script Execution en la página Rhino Examples. Básicamente, JavaScript no admite el enhebrado directamente, pero es posible que pueda utilizar un hilo de Java para lograr lo que está buscando.

36

Puede utilizar java.util.Timer y java.util.TimerTask a rodar su propio conjunto/Tiempo límite claro y ajustar funciones del intervalo/claros:

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

Whit el fragmento de código, yo era capaz de correr Jasmine pruebas dentro de Rhino sin la necesidad de EnvJS. ¡Gracias! –

+0

Ojalá pudiera darte 100 votos favorables, muy impresionante. Muchas gracias. – Upgradingdave

+2

Impresionante. ¡Gracias! Para ser totalmente compatible con los navegadores, también debe manejar la omisión de demoras. MDN dice que el retraso mínimo según la especificación HTML5 es de 4ms, así que agregue lo siguiente: if (delay == null) {delay = 4; } –

2

Otra versión utilizando ScheduledThreadPoolExecutor, compatible con Rhino 1.7R4 y propuesto por @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; 

})() 

Referencia: https://gist.github.com/nbeloglazov/9633318

Cuestiones relacionadas