網頁

2016年7月10日 星期日

Java Nashorn Engine 的 setTimeout 使用方式

之前想透過 Java 的 Nashron 執行 setTimeout 這個定時執行的 JavaScript 函式碰到問題
看起來 Nashorn 並沒有實作關於非同步的 JavaScript 機制
我並沒有花太多時間查閱相關規格,只能猜想也許他鼓勵設計者使用 Java 的 async 機制

不過有時候需要執行的JavaScript Code 沒辦法排除 setTimeout 而改寫成 Java code
查到的相容寫法如下:

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;

    setTimeout(function(){ [your function code] }, [delay]);

})()

用上述方式就可以繼續執行 setTimeout 了
不過需要注意 Java 7 有一段時間的Rhino版本有Bug而沒辦法跑
所以只如標題推薦的在 Nashorn 使用

沒有留言:

張貼留言