之前想透過 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 使用
看起來 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 使用
留言
張貼留言