è un server Javascript (motore rhino), quindi setTimeout non è disponibile. come eseguire una funzione in modo asincrono?come eseguire una funzione javascript in modo asincrono, senza utilizzare setTimeout?
14
A
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;
})()
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
- 1. come utilizzare setTimeout in modo asincrono su node.js
- 2. JavaScript setTimeout setInterval all'interno di una funzione
- 3. setTimeout su Funzione asincrona
- 4. Come eseguire una funzione di temporizzazione in Delphi (come setTimeout in JavaScript)?
- 5. Come chiamare una funzione/procedura in modo asincrono in Delphi (Senza componenti)
- 6. Come eseguire una funzione selezionata in modo casuale in JavaScript?
- 7. Come utilizzare setTimeout() in Coffeescript
- 8. chiamata setTimeout senza indugio
- 9. Come eseguire una funzione in modo asincrono ogni 60 secondi in Python?
- 10. JavaScript setTimeout() non aspetterà di eseguire?
- 11. usando setTimeout sincrono in JavaScript
- 12. Stringa in esecuzione come funzione in javascript setTimeout?
- 13. Come eseguire una funzione più volte in modo asincrono e ottenere il primo risultato
- 14. eseguire una funzione in modo casuale
- 15. JavaScript setTimeout non può accedere variabile funzione
- 16. Esiste una funzione simile a setTimeout() (JavaScript) per PHP?
- 17. variabili JavaScript undefined all'interno della funzione setTimeout
- 18. Javascript ES6 generatore asincrono
- 19. Come posso eseguire le query di NHibenate in modo asincrono?
- 20. setTimeout e "this" in JavaScript
- 21. Come eliminare una cartella in modo asincrono
- 22. setTimeout con Loop in JavaScript
- 23. Modo per eseguire le funzioni membro jQuery all'interno di setTimeout senza chiusura?
- 24. modo asincrono caricare Nokia Maps API Javascript
- 25. Non bloccante sleep in C# 5.0 (come setTimeout in JavaScript)
- 26. stop settimeout in funzione ricorsiva
- 27. Eseguire javascript senza UIWebView possibile?
- 28. Come utilizzare "setTimeout" per richiamare l'oggetto stesso
- 29. Come posso utilizzare Tornado e Redis in modo asincrono?
- 30. sovrascrivere una funzione globale in javascript
Pentecoste lo snippet di codice, sono stato in grado di correre Jasmine prova all'interno di Rhino senza bisogno di EnvJS. Grazie! –
Vorrei poterti dare 100 upvotes, davvero fantastico. Grazie mille. – Upgradingdave
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; } –