es un lado del servidor Javascript (motor de rinoceronte), por lo que setTimeout no está disponible. cómo ejecutar una función de forma asíncrona?cómo ejecutar una función javascript asincrónicamente, sin usar setTimeout?
14
A
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;
})()
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
- 1. JavaScript setTimeout setInterval dentro de una función
- 2. JavaScript setTimeout() no esperará a ejecutar?
- 3. setTimeout en la función asíncrona
- 4. ¿Puede PHP usar sockets asincrónicamente?
- 5. ¿Existe una función similar a setTimeout() (JavaScript) para PHP?
- 6. llamada setTimeout sin demora
- 7. JavaScript - ejecutar una vez sin booleanos
- 8. llamada de función Javascript setTimeout con argumento de evento?
- 9. usando setTimeout sincrónicamente en JavaScript
- 10. Variables en una función setTimeout (jQuery)
- 11. Ejecutar una función JavaScript en una aplicación C#
- 12. ¿SetTimeout sin demora es lo mismo que ejecutar la función al instante?
- 13. javascript setTimeout call error
- 14. setTimeout sin bloqueo en javascript vs sleep en ruby
- 15. ¿Es posible obtener texto pegado sin utilizar la función setTimeout()?
- 16. setTimeout y "this" en JavaScript
- 17. La función setTimeout de Javascript no llama a
- 18. Recursión de Javascript settimeout
- 19. Dormir sin bloqueo en C# 5.0 (como setTimeout en JavaScript)
- 20. ¿Cómo ejecutar una función seleccionada al azar en JavaScript?
- 21. SetTimeout no retrasa una llamada de función
- 22. Usar setInterval en JavaScript sin usar una función anónima en línea
- 23. Formas de pago equivalentes a javascript setTimeout
- 24. ejecutar una función de JavaScript desde un php if
- 25. ¿Cómo pausar una llamada a setTimeout?
- 26. ¿Cómo hacer una función de temporizador de disparo en Delphi (como setTimeout en JavaScript)?
- 27. Cómo implementar una "función de tiempo de espera" en Javascript - no sólo el 'setTimeout'
- 28. ¿Cómo obtener los subprocesos 'stdout data asincrónicamente?
- 29. Cómo ejecutar una función jQuery después de ejecutar todos y cada uno de los javascript
- 30. Ejecutar fondo Tarea En Javascript
Whit el fragmento de código, yo era capaz de correr Jasmine pruebas dentro de Rhino sin la necesidad de EnvJS. ¡Gracias! –
Ojalá pudiera darte 100 votos favorables, muy impresionante. Muchas gracias. – Upgradingdave
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; } –