procedure
procedure
by Chelo Quilón
JavaScript
/* jslint node: true */
"use strict";
function Procedure(){
this.jobs = [];
this.main = new Queue();
this.main.main = true;
this.main.procedure = this;
}
Procedure.prototype.add = function(name,func){
var procedure = this;
var args = Array.prototype.slice.call(arguments);
if(typeof name !== "string"){
func = name;
name = "Job-"+procedure.jobs.length;
args = args.slice(1);
} else {
args = args.slice(2);
}
procedure.jobs.push({name:name,func:func,args:args});
return procedure;
};
Procedure.prototype.queue = function(){
return this.resolve('queue');
};
Procedure.prototype.race = function(){
return this.resolve('race');
};
Procedure.prototype.resolve = function(mode){
var procedure = this;
var resolve;
resolve = mode === 'race' ? new Race() : new Queue();
resolve.jobs = procedure.jobs;
resolve.procedure = procedure;
procedure.jobs = [];
resolve.handler = function(error){
var data = Array.prototype.slice.call(arguments);
if(error){
procedure.main.handler.apply(procedure.main,data);
} else {
procedure.main.done.apply(procedure.main,[undefined].concat(data));
}
};
procedure.main.jobs.push({func:resolve.launch.bind(resolve),args:[]});
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.handler = undefined;
this.jobs = [];
this.results = {};
this.errors = [];
}
Race.prototype.launch = function(){
var data = Array.prototype.slice.call(arguments);
data = data.slice(0,-1);
if(this.jobs.length===0){
this.handler(undefined,this.results);
} else {
for(var i = 0,l=this.jobs.length;i<l;i++){
var job = this.jobs[i];
...