在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享Javascript工作流引擎代码及实例,希望可以对大家能有小小的帮助。
【 tulaoshi.com - Web开发 】
最近在学习jBPM和Javascript,所以按照一些相关概念自己写了下面的200行代码的“工作流引擎”,工作流管理系统包含了流程定义,引擎,及应用系统三个主要部分,下面的代码实现了流程的分支合并,目前只支持一种环节上的迁移。拷贝到html,双击就可以跑起来。
var workflowDef = {
start:{
fn:"begin", //对应处理方法可以在内部定义,也可以在外部定义
next:["task1","task2"]
},
end:"end",
tasks:[{
id:"task1",
fn:function(){
alert("执行任务一");
},
before:function(){
alert("执行任务一前");
},
after:function(){
alert("执行任务一后");
},
next:["task4","task5"]
},{
id:"task2",
fn:function(){
alert("执行任务二");
},
before:function(){
alert("执行任务二前");
},
after:function(){
alert("执行任务二后");
},
next:["task3"]
},{
id:"task3",
fn:function(){
alert("执行任务三");
},
before:function(){
alert("执行任务三前");
},
after:function(){
alert("执行任务三后");
},
//定义合并的数量
merge: 3,
next:"EOWF"
},{
id:"task4",
fn:function(){
alert("执行任务四");
},
before:function(){
alert("执行任务四前");
},
after:function(){
alert("执行任务四后");
},
next:["task3"]
},{
id:"task5",
fn:function(){
alert("执行任务五");
},
before:function(){
alert("执行任务五前");
},
after:function(){
alert("执行任务五后");
},
next:["task3"]
}]
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//////////定义引擎////////////
Yi = {};
Yi.Utils = {};
Yi.Utils.execute = function(o){
if(typeof o != 'function')
eval(o)();
else
o();
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//工作流类
Yi.Workflow = function(workflowDef){
this.def = workflowDef;
this.tasks = this.def.tasks;
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//public按照环节id查找查找
Yi.Workflow.prototype.findTask = function(taskId){
for(var i=0;ithis.tasks.length;i++){
if(this.tasks[i].id == taskId)
return this.tasks[i];
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//public启动工作流
Yi.Workflow.prototype.start = function(){
this.currentTasks = [];
Yi.Utils.execute(this.def.start.fn);
for(var i=0;ithis.def.start.next.length;i++){
this.currentTasks[i] = this.findTask(this.def.start.next[i]);
Yi.Utils.execute(this.currentTasks[i].before);
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//private
Yi.Workflow.prototype.findCurrentTaskById = function(taskId){
for(var i=0;ithis.currentTasks.length;i++){
if(this.currentTasks[i].id == taskId)
return this.currentTasks[i];
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)return null;
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//private
Yi.Workflow.prototype.removeFromCurrentTasks = function(task){
var temp = [];
for(var i=0;ithis.currentTasks.length;i++){
if(!(this.currentTasks[i] == task))
temp.push(this.currentTasks[i]);
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)this.currentTasks = temp;
temp = null;
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//public触发当前环节
Yi.Workflow.prototype.signal = function(taskId){
//只处理当前活动环节
var task = this.findCurrentTaskById(taskId);
if(task == null){
alert("工作流未流转到此环节!");
return;
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//对于合并的处理
if(task.merge != undefined){
if(task.merge != 0){
alert("工作流流转条件不充分!");
return;
}else{
Yi.Utils.execute(task.before);
}
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//触发当前环节
Yi.Utils.execute(task.fn);
//触发后动作
Yi.Utils.execute(task.after);
//下一步如果工作流结束
if(task.next === "EOWF"){
Yi.Utils.execute(this.def.end);
delete this.currentTasks;
return;
}
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)//遍历下一步环节
this.removeFromCurrentTasks(task);
for(var i=0;itask.next.length;i++){
来源:http://www.tulaoshi.com/n/20160219/1611414.html
看过《Javascript工作流引擎代码及实例》的人还看了以下文章 更多>>