codiad/components/worker_manager/init.js

72 lines
2.2 KiB
JavaScript
Executable File

(function(global, $){
codiad.workerManager = {
taskQueue: [],
addTask: function(taskConfig, callback, context){
var _this = this;
if(_this.worker !== null) {
this.taskQueue.push({
config: taskConfig,
callback: callback,
context: context
});
this.clearSubsidableTasks(taskConfig.id);
if (! this.workerRunning()) {
var initStatus = this.initiateWorker();
if (! initStatus) {
callback(null, false);
return;
}
this.worker.addEventListener('message', function(e){
_this.concludeTask(e.data);
}, false);
}
if (this.taskQueue.length == 1) {
this.scheduleNext();
}
} else {
callback(false,taskConfig.id);
}
},
workerRunning: function(){
return !! this.worker;
},
initiateWorker: function(){
if ( typeof Worker !== 'undefined' && Worker !== null )
{
this.worker = new Worker('components/worker_manager/worker.js');
return !! this.worker;
}
},
clearSubsidableTasks: function(id){
var i = this.taskQueue.length -2;
while(i > 0) {
if (this.taskQueue[i].id == id) {
this.taskQueue.splice(i, 1);
}
i--;
}
},
scheduleNext: function(){
var taskConfig = this.taskQueue[0].config;
this.worker.postMessage(taskConfig);
},
concludeTask: function(msg){
if (this.taskQueue.length > 0) {
var tq = this.taskQueue[0];
callback = tq.callback;
context = tq.context;
this.taskQueue.splice(0, 1);
if (this.taskQueue.length > 0) {
this.scheduleNext();
}
tq.callback.apply(context, [msg.success, msg.result]);
}
}
}
})(this, jQuery);