如何异步运行javascript函数,而不使用setTimeout?

时间:2010-02-14 16:09:54

标签: javascript rhino parallel-processing

它是服务器端Javascript(rhino引擎),因此setTimeout不可用。如何异步运行一个函数?

3 个答案:

答案 0 :(得分:39)

您可以使用java.util.Timerjava.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;

})()

答案 1 :(得分:6)

查看Rhino Examples页面上的Multithreaded Script Execution示例。基本上,JavaScript不直接支持线程,但您可以使用Java线程来实现您的目标。

答案 2 :(得分:3)

使用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;

})()

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