已知有流程step1、step2、step3、step4、step5 , 如何控制输出下面过程

例如:

1:step1、step2、step3、step2、step3、step4、step5

2:step1、step2、step4、step5

3:step1、step2、step4、step5、step3、step4、step5

/*
* 流程控制器
* 作者:caoke
* */ class Step{
//初始化
constructor(stepArr,callback){ this.stepArr=stepArr;
this.curIndex=0;
this.isPaused=false;
this.nextMode=null;
this.curStep=this.stepArr[this.curIndex];
this.hasRunTimes={};
this.stepArr.forEach( (step)=> {
this.hasRunTimes[step]=0;
})
this.callback=callback;
}
callback(){
this.go()
}
// 运行当前流程
run(){
this.curStep=this.stepArr[this.curIndex]
if(this.curStep){
this.hasRunTimes[this.curStep]++
this.callback&&this.callback.apply(this,[this.curStep,this.hasRunTimes[this.curStep]])
}
}
// 跳转到某个流程
go(step){
this.clear()
if(step){
this.curIndex=this.stepArr.indexOf(step)
}else{
this.curIndex++
}
this.run()
} // 进入下一个流程
next(){
if(this.nextMode){
this.go(this.nextMode.nextStep)
}else{
this.go()
}
} // 自动进入下一步
waitSecondAndGo(second,step){
if(!this.isPaused){
this.stopTimer()
}
const mode={
startTime:new Date().getTime(),
allSecond:second,
leftSecond:second*1000,
nextStep:step,
timer:null,
} //获得下一步
if(this.nextMode==null||mode.leftSecond<this.nextMode.leftSecond){
this.nextMode=mode;
} if(!this.isPaused){
this.startTimer()
} }
// 暂停
pause(){
if(!this.isPaused){
this.isPaused=true;
this.stopTimer() } }
// 继续
repause(){
if(this.isPaused){
this.isPaused=false;
this.startTimer()
} }
stopTimer(){
if(this.nextMode&&this.nextMode.timer){
const duration=new Date().getTime()-this.nextMode.startTime;
this.nextMode.leftSecond=this.nextMode.leftSecond-duration; clearTimeout(this.nextMode.timer);
this.nextMode.timer=null;
}
}
startTimer(){
if(this.nextMode&&this.nextMode.timer==null){
this.nextMode.startTime=new Date().getTime();
this.nextMode.timer=setTimeout(() => {
this.go(this.nextMode.nextStep)
},this.nextMode.leftSecond)
}
}
// 销毁
clear(){
if(this.nextMode){
if(this.nextMode.timer){
clearTimeout(this.nextMode.timer);
this.nextMode.timer=null
}
this.nextMode=null
}
}
}
export default Step;

  

  

  

  

  

  

JavaScript 流程控制器的更多相关文章

  1. 第一百零一节,JavaScript流程控制语句

    JavaScript流程控制语句 学习要点: 1.语句的定义 2.if 语句 3.switch语句 4.do...while语句 5.while语句 6.for语句 7.for...in语句 8.br ...

  2. Javascript流程控制

    Javascript流程控制 1.条件语句 (1)if(exp)执行一句代码 (2)if(exp){执行代码段;} (3)if(exp){exp为true执行代码段}else{exp为false执行的 ...

  3. JavaScript流程控制语句脑图

    JavaScript流程控制语句脑图 图片是从网上找来的,在这记录一下,以备后面需要的时候查找方便. JavaScript通过规定的语句让有条件的按照一定的方式执行. 分为:循环语句 while do ...

  4. JavaScript 流程控制-分支

    JavaScript 流程控制-分支 1.流程控制 在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能. 简单理解:流程控 ...

  5. Javascript 流程控制

    流程控制 JavaScript通过流程语句来执行程序流,程序流有若干语句组成.在正常情况下,程序中 的语句时按照书写顺序执行的,这种结构称为顺序结构.除了顺序结构之外还有选择结构和循环结构. 1.选择 ...

  6. JavaScript流程控制及函数

    1 流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code...} 双向分支 if (条件表达式){    } else {    } <!DOCTYPE html& ...

  7. javaScript流程控制与函数

    流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code... } <!DOCTYPE html> <html> <head> <m ...

  8. javascript 流程控制及函数

    回顾 基本语法 在html的使用 <script></script> 注释 ///* */ 指令结束符 ;换行 输出 console.log()document.write() ...

  9. JavaScript流程控制语句

    一.JavaScript分支语句 -alert()    弹出警告对话框 -prompt() 弹出输入框 1.if(){}else{} 栗子: var num=prompt("请输入电话号码 ...

随机推荐

  1. vi/vim 消除搜索后的关键字高亮

    使用vi或vim命令搜索某个关键字之后,取消高亮显示的方法 只要输入:noh即可

  2. 独立看门狗实验-IWDG

    为什么要看门狗? 注意:喂狗是0XAAAA写到KR. 头文件iwdg.h iwdg.c

  3. Qt资源整理ING

    QCustomPlot:图表库,开源, 链接地址http://www.qcustomplot.com/index.php/download 一些Qt的开发库:http://qt-project.org ...

  4. js流程图:aworkflow.js

    auto-workflow 用于快速构建各种关系图的库 github地址:https://github.com/auto-workflow/AWorkflow 快速开始 npm install awo ...

  5. up7-文件保存位置

    asp.net 默认位置:项目/upload/年/月/日/guid/ 代码截图: 位置截图:   jsp 默认位置:tomcat/webapps/Uploader7Oracle/upload/年/月/ ...

  6. eclipse 市场

    http://marketplace.eclipse.org/ 如何找工具官网? 举例:UMLet 进入官网以后,下载插件,然后离线安装.

  7. OpenNI depth深度数据的数据格式

    图像如何打开 如何查看它的数据格式并一个个读取 试一下ENVI等 可见,灰度图的Data只有一个值[0],而彩色图的Data却有三个值[142,119,113]. 这是用ENVI的Cursor Val ...

  8. 编写高质量代码改善C#程序的157个建议——建议120:为程序集指定强名称

    建议120:为程序集指定强名称 虽然强名称在设计之初有防止被未授权的第三方软件非法执行程序的作用,但是因为它的破解方法并不难,所以现在强名称更多的意义在于它可以避免出现“DLL HELL”现象. “D ...

  9. _I、_O、_IO的含义

    转自:http://blog.csdn.net/daa20/article/details/42339695 __I. __O .__IO是什么意思? 这是ST库里面的宏定义,定义如下: #defin ...

  10. 从Entity Framework的实现方式来看DDD中的repository仓储模式运用

    一:最普通的数据库操作 static void Main(string[] args) { using (SchoolDBEntities db = new SchoolDBEntities()) { ...