Ответ 1
Посмотрите пример Multithreaded Script Execution
на странице Rhino Examples. В принципе, JavaScript не поддерживает потоковую передачу напрямую, но вы можете использовать поток Java для достижения того, что вы ищете.
его серверный Javascript (движок носорога), поэтому setTimeout недоступен. как запустить функцию асинхронно?
Посмотрите пример Multithreaded Script Execution
на странице Rhino Examples. В принципе, JavaScript не поддерживает потоковую передачу напрямую, но вы можете использовать поток Java для достижения того, что вы ищете.
Вы можете использовать java.util.Timer
и java.util.TimerTask
, чтобы свернуть собственный набор/очистить таймаут и установить/очистить Интервальные функции:
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;
})()
Другая версия, использующая 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;
})()