его сервер Javascript (двигатель носорога), поэтому setTimeout недоступен. как запустить функцию асинхронно?Как запустить функцию javascript асинхронно, не используя setTimeout?
14
A
ответ
5
Посмотрите пример Multithreaded Script Execution
на странице Rhino Examples. В принципе, JavaScript не поддерживает потоки напрямую, но вы можете использовать поток Java для достижения того, что вы ищете.
36
Вы можете использовать java.util.Timer
и java.util.TimerTask
свернуть свой собственный набор/осветления Timeout и установить/очистить функции Интервал:
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
Другой версии с помощью 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;
})()
Уит ваш фрагмент кода, я был в состоянии работать жасмин тесты внутри Rhino без необходимости EnvJS. Благодаря! –
Хотелось бы, чтобы я мог дать вам 100 upvotes, очень удивительный. Спасибо. – Upgradingdave
Awesome. Благодаря! Чтобы быть полностью совместимым с браузерами, вам также необходимо справиться с отсутствием задержки. MDN говорит, что минимальная задержка по спецификации HTML5 составляет 4 мс, поэтому добавьте следующее: if (delay == null) {delay = 4; } –