Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Last active October 12, 2016 14:18
Show Gist options
  • Save mohayonao/50547c5a51a7ca71c90d to your computer and use it in GitHub Desktop.
Save mohayonao/50547c5a51a7ca71c90d to your computer and use it in GitHub Desktop.
WorkerTimer for Browser
<script src="/path/to/WorkerTimer.js"></script>
<script>
function usage1() {
var timerAPI = WorkerTimer; // ここを window にすると普通のタイマーを使う (切り替えられる)
var timerId = timerAPI.setInterval(function() {
playBeep();
}, 100);
timerAPI.setTimeout(function() {
timerAPI.clearTimeout(timerId);
}, 5000);
}
</script>
window.WorkerTimer = (function() {
var TIMER_WORKER_SOURCE = [
"var timerIds = {}, _ = {};",
"_.setInterval = function(args) {",
" timerIds[args.timerId] = setInterval(function() { postMessage(args.timerId); }, args.delay);",
"};",
"_.clearInterval = function(args) {",
" clearInterval(timerIds[args.timerId]);",
"};",
"_.setTimeout = function(args) {",
" timerIds[args.timerId] = setTimeout(function() { postMessage(args.timerId); }, args.delay);",
"};",
"_.clearTimeout = function(args) {",
" clearTimeout(timerIds[args.timerId]);",
"};",
"onmessage = function(e) { _[e.data.type](e.data) };"
].join("");
var _timerId = 0;
var _callbacks = {};
var _timer = new global.Worker(global.URL.createObjectURL(
new global.Blob([ TIMER_WORKER_SOURCE ], { type: "text/javascript" })
));
_timer.onmessage = function(e) {
if (_callbacks[e.data]) {
_callbacks[e.data].callback.apply(null, _callbacks[e.data].params);
}
};
return {
setInterval: function(callback, delay) {
var params = Array.prototype.slice.call(arguments, 2);
_timerId += 1;
_timer.postMessage({ type: "setInterval", timerId: _timerId, delay: delay });
_callbacks[_timerId] = { callback: callback, params: params };
return _timerId;
},
setTimeout: function(callback, delay) {
var params = Array.prototype.slice.call(arguments, 2);
_timerId += 1;
_timer.postMessage({ type: "setTimeout", timerId: _timerId, delay: delay });
_callbacks[_timerId] = { callback: callback, params: params };
return _timerId;
},
clearInterval: function(timerId) {
_timer.postMessage({ type: "clearInterval", timerId: timerId });
_callbacks[timerId] = null;
},
clearTimeout: function(timerId) {
_timer.postMessage({ type: "clearTimeout", timerId: timerId });
_callbacks[timerId] = null;
}
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment