Skip to content

Instantly share code, notes, and snippets.

@westc
Created March 16, 2016 22:08
Show Gist options
  • Save westc/b3c887965e1c98087799 to your computer and use it in GitHub Desktop.
Save westc/b3c887965e1c98087799 to your computer and use it in GitHub Desktop.
Use web workers to limit the amount of time that an eval can run.
function limitEval(code, fnOnStop, opt_timeoutInMS) {
var id = Math.random() + 1,
blob = new Blob(
['onmessage=function(a){a=a.data;postMessage({i:a.i+1});postMessage({r:eval.call(this,a.c),i:a.i})};'],
{ type:'text/javascript' }
),
myWorker = new Worker(URL.createObjectURL(blob));
function onDone() {
URL.revokeObjectURL(blob);
fnOnStop.apply(this, arguments);
}
myWorker.onmessage = function (data) {
data = data.data;
if (data) {
if (data.i === id) {
id = 0;
onDone(true, data.r);
}
else if (data.i === id + 1) {
setTimeout(function() {
if (id) {
myWorker.terminate();
onDone(false);
}
}, opt_timeoutInMS || 1000);
}
}
};
myWorker.postMessage({ c: code, i: id });
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment