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

3

19

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

Antinomy answered 14/2, 2010 at 16:9 Comment(0)
H
5

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.

Hued answered 14/2, 2010 at 16:42 Comment(0)
P
42

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;

})()
Portable answered 24/4, 2011 at 0:32 Comment(6)
Whit your code snippet, i was able to run Jasmine tests inside Rhino without the need of EnvJS. Thanks!Malaria
I wish I could give you 100 upvotes, very awesome. Thanks so much.Desma
Awesome. Thanks! To be fully compatibile with browsers, you need to handle omission of delay as well. MDN says that the minium delay as per the HTML5 spec is 4ms, so add the following: if (delay == null) { delay = 4; }Exciting
@DaveParoulek You can give a bounty to Weston ;)Bohn
NOTA: Rhino 1.7R4 has a bug that prevents the code in this answer to run. Either downgrade to 1.7R3 or use a newer version. (Check this discussion for details on newer versions: groups.google.com/d/msg/mozilla-rhino/6vvcjg_7NNU/XnWEPEyfcfwJ)Bohn
@Alex, I created version that uses ScheduledThreadPoolExecutor instead of Timer and works in 1.7R4: gist.github.com/nbeloglazov/9633318Asperity
H
5

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.

Hued answered 14/2, 2010 at 16:42 Comment(0)
B
3

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

Bohn answered 19/3, 2014 at 8:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.