これはサーバー側の Javascript (rhino エンジン) であるため、setTimeout は使用できません。関数を非同期で実行する方法は?
9432 次
3 に答える
41
java.util.Timer
およびを使用しjava.util.TimerTask
て、独自の set/clear Timeout および set/clear Interval 関数をロールすることができます。
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;
})()
于 2011-04-24T00:32:53.917 に答える
5
Rhino ExamplesMultithreaded Script Execution
ページの例を見てください。基本的に、JavaScript はスレッド化を直接サポートしていませんが、Java スレッドを使用して目的を達成できる場合があります。
于 2010-02-14T16:42:48.570 に答える
3
Rhino 1.7R4 と互換性があり、@Nikita-Beloglazovによって提案されたScheduledThreadPoolExecutorを使用する別のバージョン:
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;
})()
于 2014-03-19T08:17:27.310 に答える