2010-02-14 8 views

risposta

5

Dai un'occhiata all'esempio Multithreaded Script Execution sulla pagina Rhino Examples. Fondamentalmente, JavaScript non supporta direttamente il threading, ma potresti essere in grado di utilizzare un thread Java per ottenere ciò che stai cercando.

36

È possibile utilizzare java.util.Timer e java.util.TimerTask a rotolare il proprio set/Timeout chiaro e impostare le funzioni Intervallo/chiare:

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

Pentecoste lo snippet di codice, sono stato in grado di correre Jasmine prova all'interno di Rhino senza bisogno di EnvJS. Grazie! –

+0

Vorrei poterti dare 100 upvotes, davvero fantastico. Grazie mille. – Upgradingdave

+2

Fantastico. Grazie! Per essere pienamente compatibili con i browser, è necessario gestire anche l'omissione del ritardo. MDN dice che il minium delay secondo la specifica HTML5 è 4ms, quindi aggiungi quanto segue: if (delay == null) {delay = 4; } –

2

Un'altra versione utilizzando ScheduledThreadPoolExecutor, compatibile con Rhino 1.7R4 e proposto da @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; 

})() 

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

Problemi correlati