how to run a javascript function asynchronously, without using setTimeout?

后端 未结 3 366
无人及你
无人及你 2021-02-01 07:03

its a server side Javascript (rhino engine), so setTimeout is not available. how to run a function asynchronously?

相关标签:
3条回答
  • 2021-02-01 07:14

    Another version using ScheduledThreadPoolExecutor, compatible with Rhino 1.7R4 and proposed by @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;
    
    })()
    

    Reference: https://gist.github.com/nbeloglazov/9633318

    0 讨论(0)
  • 2021-02-01 07:16

    You can use java.util.Timer and java.util.TimerTask to roll your own set/clear Timeout and set/clear Interval functions:

    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;
    
    })()
    
    0 讨论(0)
  • 2021-02-01 07:19

    Have a look at the Multithreaded Script Execution example on the Rhino Examples page. Basically, JavaScript does not support threading directly, but you may be able to use a Java thread to achieve what you are looking for.

    0 讨论(0)
提交回复
热议问题