Example 2 - Procedure Library
by Chelo Quilón
JavaScript
// -------------------------------------- LIBRARY CODE ---------------------------------------------
function Procedure(data){
this.data = data || {};
this.jobs = [];
this.main = new Queue();
this.main.data = this.data;
}
Procedure.prototype.add = function(func){
var procedure = this;
var args = Array.prototype.slice.call(arguments).slice(1);
procedure.jobs.push({func:func,args:args});
return procedure;
};
Procedure.prototype.queue = function(handler){
var procedure = this;
var queue = new Queue();
queue.jobs = procedure.jobs;
queue.data = procedure.data;
procedure.jobs = [];
queue.handler = function(error){
if(handler){handler.call(queue,error);}
if(error){
procedure.main.handler(error);
} else {
procedure.main.done();
}
};
procedure.main.jobs.push({func:queue.launch.bind(queue)});
return procedure;
};
Procedure.prototype.race = function(handler){
var procedure = this;
var race = new Race();
race.jobs = procedure.jobs;
race.data = procedure.data;
procedure.jobs = [];
race.handler = function(error){
if(handler){handler.call(race,error);}
if(error){
procedure.main.handler(error);
} else {
procedure.main.done();
}
};
procedure.main.jobs.push({func:race.launch.bind(race)});
return procedure;
};
Procedure.prototype.launch = function(handler){
var procedure = this;
procedure.main.handler = handler;
procedure.main.jobs = procedure.main.jobs.concat(procedure.jobs);
procedure.main.launch();
};
Procedure.Race = Race;
function Race(){
this.jobs = [];
this.data= {};
this.counter = 0;
}
Race.prototype.launch = function(){
this.counter = this.jobs.length;
for(var i = 0,l=this.jobs.length;i<l;i++){
Procedure.Launcher(this,this.jobs[i]);
}
};
Race.prototype.done = function(){
if(--this.counter === 0){
this.handler();
}
};
...