/* * ------------------------------------------------------- * Project: AsyncTask * Version: 0.1.0 * * Author: Jalal Chaabane * Site: * Contact: jalal.chaabane@gmail.com * * * Copyright (c) 2014 Jalal Chaabane * ------------------------------------------------------- */ "use strict";var Async={};Async.extend=function(parent,child){for(var key in parent)child[key]=parent[key];return child},Async.Events=function(){var _listeners={};return{receiveMsg:function(msg){var event=_listeners[msg.eventName];"undefined"!=typeof event&&event.forEach(function(callback){callback.apply(callback,[msg].concat(msg.data))})},unbind:function(eventName,callback){var index,event=_listeners[eventName];"undefined"!=typeof event&&-1!==(index=event.indexOf(callback))&&event.splice(index,1)},unbindAllByName:function(eventName){var event=_listeners[eventName];"undefined"!=typeof event&&(_listeners[eventName]=[])},on:function(eventName,callback){var event=_listeners[eventName];"undefined"!=typeof event?event.push(callback):_listeners[eventName]=[callback]}}},Async.Task=function(action){var _onFinished=null,_action=action,_msgQueue=[],_result=null,_activeWorker=null;return Async.extend(new Async.Events,{parameters:[],emit:function(eventName){var msg={eventName:eventName,data:null};msg.data=Array.prototype.slice.call(arguments,1,arguments.length),null===_activeWorker?_msgQueue.push(arguments.length>2?msg:msg):_activeWorker.emit(msg)},then:function(callback){null!==_result?callback(result):_onFinished=callback},getAction:function(){return _action},getFinishCallback:function(){return _onFinished},popMessage:function(){var msg=null;return _msgQueue.length>0&&(msg=_msgQueue[0],_msgQueue.splice(0,1)),msg},setResult:function(result){_result=result},setActiveWorker:function(worker){_activeWorker=worker}})},Async.Worker=function(asyncScript){var self,thread=new Worker(asyncScript),taskQueue=[],launchNextTask=function(){var msg,taskMsg,task=taskQueue[0];for(taskMsg={eventName:"postTask",code:task.getAction().toString(),params:task.parameters},task.setActiveWorker(self),thread.postMessage(taskMsg);null!==(msg=task.popMessage());)thread.postMessage(msg)},onTaskDone=function(msg){var task,finishCallback;taskQueue.length>0&&(task=taskQueue[0],taskQueue.splice(0,1),finishCallback=task.getFinishCallback(),null!==finishCallback?finishCallback(msg.result):task.setResult(msg.result),taskQueue.length>0&&launchNextTask())};thread.addEventListener("message",function(evt){var msg=evt.data;"onTaskDone"===msg.eventName?onTaskDone(msg):taskQueue.length>0&&taskQueue[0].receiveMsg(msg)});var self={isDedicated:!1,post:function(task,parameters){var newTask;return newTask="function"==typeof task?new Async.Task(task):task,newTask.parameters=parameters,taskQueue.push(newTask),1===taskQueue.length&&launchNextTask(),newTask},emit:function(msg){thread.postMessage(msg)},getNbTask:function(){return taskQueue.length},terminate:function(){thread.terminate()}};return self},Async.WorkerPool=function(nbWorker,asyncScript){var _workers=[];if(0===nbWorker)throw{msg:"Cannot create worker pool with 0 thread"};for(var i=0;nbWorker>i;i++)_workers.push(new Async.Worker(asyncScript));var getWorker=function(){var lessWorker=_workers[0];return _workers.forEach(function(worker){worker.getNbTask()2&&(parameters=Array.prototype.slice.call(arguments,2,arguments.length),parameters=processParameters(parameters)),isInfinite===!0&&(worker.isDedicated=!0),worker.post(task,parameters)},terminate:function(){_workers.forEach(function(worker){worker.terminate()}),_workers=[]}}};