Skip to content

Instantly share code, notes, and snippets.

@pthiers
Last active June 30, 2016 19:28
Show Gist options
  • Save pthiers/130f3ed4b04d12f286529aaed8a5b8ae to your computer and use it in GitHub Desktop.
Save pthiers/130f3ed4b04d12f286529aaed8a5b8ae to your computer and use it in GitHub Desktop.
web worker with event launcher
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Worker</title>
</head>
<body>
<script type="text/js-worker">
var factorial = function(value){
if(value === 1 || value === 0)
return 1;
return value * factorial(value-1);
};
var id = Date.now();
onmessage = function (oEvent) {
switch (oEvent.data.type) {
case 'factorial':
var response = {
id: id,
type: 'factorial',
value: factorial(oEvent.data.value)
};
this.postMessage(response);
break;
default:
var response = {
id: oEvent.data.id,
type: 'default',
value: 'default'
};
this.postMessage(response);
break;
}
}
</script>
<script type="text/javascript">
var CONST_MAX_WORKER = 4;
var CONST_NEW_WORKER_EVENT = "Event";
var Event = document.createEvent('Event');
Event.initEvent(CONST_NEW_WORKER_EVENT, true, true);
//worker loader
var blob = new Blob(Array.prototype.map.call(
document.querySelectorAll("script[type=\"text\/js-worker\"]"),
function (oScript) { return oScript.textContent; }
),
{
type: "text/javascript"
}
);
var url = window.URL.createObjectURL(blob);
var values = [];
for (var i = 0, l = 20; i < l; i++) {
values.push(Math.round(Math.random() * l))
}
document.addEventListener(CONST_NEW_WORKER_EVENT,function(){
var w = new Worker(url);
w.onmessage = function(e){
console.log(e.data);
document.dispatchEvent(Event);
this.terminate();
}
if(values.length>0){
value = values.shift();
w.postMessage({
type:'factorial',
value: value
});
}else{
w.terminate();
}
},false);
for(var i = 0;i<CONST_MAX_WORKER; i++){
document.dispatchEvent(Event);
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment