18

これはサーバー側の Javascript (rhino エンジン) であるため、setTimeout は使用できません。関数を非同期で実行する方法は?

4

3 に答える 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;

})()

参照: https://gist.github.com/nbeloglazov/9633318

于 2014-03-19T08:17:27.310 に答える