Javascript工作流引擎代码及实例

2016-02-19 16:14 0 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享Javascript工作流引擎代码及实例,希望可以对大家能有小小的帮助。

【 tulaoshi.com - Web开发 】

  最近在学习jBPM和Javascript,所以按照一些相关概念自己写了下面的200行代码的“工作流引擎”,工作流管理系统包含了流程定义,引擎,及应用系统三个主要部分,下面的代码实现了流程的分支合并,目前只支持一种环节上的迁移。拷贝到html,双击就可以跑起来。

var workflowDef = {

         start:{

                   fn:"begin", //对应处理方法可以在内部定义,也可以在外部定义

                   next:["task1","task2"]

         },

         end:"end",

         tasks:[{

                   id:"task1",

                   fn:function(){

                            alert("执行任务一");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   before:function(){

                            alert("执行任务一前");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   after:function(){

                            alert("执行任务一后");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   next:["task4","task5"]

         },{

                   id:"task2",

                   fn:function(){

                            alert("执行任务二");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   before:function(){

                            alert("执行任务二前");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   after:function(){

                            alert("执行任务二后");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   next:["task3"]

         },{

                   id:"task3",

                   fn:function(){

                            alert("执行任务三");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   before:function(){

                            alert("执行任务三前");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                  after:function(){

                            alert("执行任务三后");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   //定义合并的数量

                   merge: 3,

                   next:"EOWF"

         },{

                   id:"task4",

                   fn:function(){

                            alert("执行任务四");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   before:function(){

                            alert("执行任务四前");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   after:function(){

                            alert("执行任务四后");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   next:["task3"]

         },{

                   id:"task5",

                   fn:function(){

                            alert("执行任务五");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   before:function(){

                            alert("执行任务五前");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   after:function(){

                            alert("执行任务五后");

                   },

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

                   next:["task3"]

         }]

}

  //////////定义引擎////////////

Yi = {};

Yi.Utils = {};

Yi.Utils.execute = function(o){

         if(typeof o != 'function')

                   eval(o)();

         else

                   o();

}

//工作流类

Yi.Workflow = function(workflowDef){

         this.def = workflowDef;

         this.tasks = this.def.tasks;

}

//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];

         }

}

//public启动工作流

Yi.Workflow.prototype.start = function(){

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

         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);

         }

}

//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];

         }

         return null;

}

//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]); 

         }

         this.currentTasks = temp;

         temp = null;

}

//public触发当前环节

Yi.Workflow.prototype.signal = function(taskId){

         //只处理当前活动环节

         var task = this.findCurrentTaskById(taskId);

         if(task == null){

                   alert("工作流未流转到此环节!");

                   return;

         }

         //对于合并的处理

         if(task.merge != undefined){

                   if(task.merge != 0){

                            alert("工作流流转条件不充分!");

                            return;

                   }else{

                            Yi.Utils.execute(task.before);

                   }        

         }

         //触发当前环节

         Yi.Utils.execute(task.fn);

         //触发后动作

         Yi.Utils.execute(task.after);

         //下一步如果工作流结束

         if(task.next === "EOWF"){

                   Yi.Utils.execute(this.def.end);

                   delete this.currentTasks;

                   return;

         }

         //遍历下一步环节

         this.removeFromCurrentTasks(task);

         for(var i=0;itask.next.length;i++){

来源:https://www.tulaoshi.com/n/20160219/1611414.html

延伸阅读
用一个函数即实现流的压缩和解压,使用方法: ZIP(源流,目标流,True/False)TRUE为压缩,FALSE为解压 函数如下: function ZIP(mInputStream: TStream; mOutputStream: TStream;Compress:BOOL): BOOL; var   I: Integer;   p:pchar;   TCS:TCompressionStream;   TDS:TDecompressionStr...
标签: Web开发
看到这个题目,或许有人会提出疑问,JavaScript代表客户端,而Session代表的是服务器(不知道这样说大家是否能够理解)。 先说一下需求,我在做一个权限管理的时候,需要在点击某个模块时,Session中相应的改变模块代号,而实现这个操作的是一个a标签,当然我不知道 一个linkbutton是否可以同时将跳转页面和修改Session做了,个人感觉应该是可...
标签: Web开发
Javascript如何判断是否是润年时,采用纠错的方式较为方便与简单一点,下面的new Date(year , month , day)中的month是从0开始,2表示3月,意思是构造3月1日的前一天,然后检查这一天的日期是否是29。实际上利用了date对象自己的纠错计算。 Javascript测试函数isSmoothYear()   以下是引用片段:  1 script language="jav...
最新的Photoshop是有跟Sketch一样的输出切图功能的(Generator),用2x的PSD输出3x的切图也可以。而且Photoshop配合Slicy输出切图比Sketch3快捷很多。 Sketch相当棒,但目前V3.1还是有不少小问题,加上对中文支持不够好,在界面设计中还不能完全取代Photoshop。 关于题目的问题,首先一份设计稿就不能适用于iOS各手机屏幕尺寸。以下是Bjango把...
标签: ASP
  一个很常见的 ASP 问题 : "如何定时工作流程执行网页?", 之所以会问这个问题大部分是因为管理员可能会利用一个 ASP 网页来作数据库维护的动作, 如备份...等, 在 Windows NT 平台有一个方法可以做工作流程, 那就是 AT 指令 + Schedule 服务, 但很可惜的是你并没有法度在命令列 (Command-Line) 执行 ASP 网页 当然你...

经验教程

859

收藏

53
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部