これは機能しているようです。
(function () {
var timers = {};
var id = 0;
var maxT = 1000; // can go up to (1 << 30)
window.setLongTimeout = function (f, t) {
var args = [].slice.call(arguments, 2);
var now = (Date.now && Date.now()) || +(new Date);
var end = now + t;
var myid = ++id;
(function loop() {
var now = (Date.now && Date.now()) || +(new Date);
var delta = end - now;
if (delta <= 0) {
delete timers[myid];
f.apply(null, args);
} else {
timers[myid] = window.setTimeout(loop, Math.min(maxT, delta));
}
})();
return id;
};
window.clearLongTimeout = function (myid) {
window.clearTimeout(timers[myid]);
delete timers[myid];
};
})();
最初に指定された時間(32ビットに制限されていない)が経過するまで、定期的にタイムアウトを発生させます。
ミリ秒を超えて使用しようとすると、精度エラーが発生することが予想され2 ^ 52
ます;-)
http://jsfiddle.net/alnitak/zGdn5/を参照してください