While Eos timers can mostly accomplish what's needed, sometimes I just want to issue a simple setTimeout(function(){...}, delay)
To do this easily, Eos would need to update to the JS-Interpreter from this pull request, allowing the native wrapper to be more easily implemented with something like:
const interpreter = new Interpreter("", (interpreter, globalObject) => {
const timeouts = {};
let timeoutCounter = 0;
const intervals = {};
let intervalCounter = 0;
const frames = {};
let frameCounter = 0;
interpreter.setProperty(
globalObject,
"setTimeout",
interpreter.createNativeFunction(function (fn, time) {
const tid = ++timeoutCounter;
const _this = this;
timeouts[tid] = setTimeout(function () {
if (timeouts[tid]) {
delete timeouts[tid];
interpreter.queueFunction(fn, _this);
interpreter.run(); // Keep running
}
}, time);
return tid;
})
);
interpreter.setProperty(
globalObject,
"clearTimeout",
interpreter.createNativeFunction((tid) => {
clearTimeout(timeouts[tid]);
delete timeouts[tid];
})
);
interpreter.setProperty(
globalObject,
"setInterval",
interpreter.createNativeFunction(function (fn, time) {
const tid = ++intervalCounter;
const _this = this;
intervals[tid] = setInterval(function () {
interpreter.queueFunction(fn, _this);
interpreter.run(); // Keep running
}, time);
return tid;
})
);
interpreter.setProperty(
globalObject,
"clearInterval",
interpreter.createNativeFunction((tid) => {
clearInterval(intervals[tid]);
delete intervals[tid];
})
);
interpreter.setProperty(
globalObject,
"requestAnimationFrame",
interpreter.createNativeFunction(function (fn, time) {
const tid = ++frameCounter;
const _this = this;
frames[tid] = requestAnimationFrame(function () {
if (frames[tid]) {
delete frames[tid];
interpreter.queueFunction(fn, _this);
interpreter.run(); // Keep running
}
}, time);
return tid;
})
);
interpreter.setProperty(
globalObject,
"cancelAnimationFrame",
interpreter.createNativeFunction((tid) => {
cancelAnimationFrame(frames[tid]);
delete frames[tid];
})
);
});
interpreter.appendCode(`
var interval = setInterval(function() {
console.log('Yay! Intervals!');
}, 1000);
setTimeout(function() {
console.log('Yay! Timeouts!');
clearInterval(interval);
}, 5000);
`);
interpreter.run();
(Code pulled from: NeilFraser/JS-Interpreter#199 (comment) )
While Eos timers can mostly accomplish what's needed, sometimes I just want to issue a simple
setTimeout(function(){...}, delay)To do this easily, Eos would need to update to the JS-Interpreter from this pull request, allowing the native wrapper to be more easily implemented with something like:
(Code pulled from: NeilFraser/JS-Interpreter#199 (comment) )