JavaScript 流程控制器
已知有流程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 流程控制器的更多相关文章
- 第一百零一节,JavaScript流程控制语句
JavaScript流程控制语句 学习要点: 1.语句的定义 2.if 语句 3.switch语句 4.do...while语句 5.while语句 6.for语句 7.for...in语句 8.br ...
- Javascript流程控制
Javascript流程控制 1.条件语句 (1)if(exp)执行一句代码 (2)if(exp){执行代码段;} (3)if(exp){exp为true执行代码段}else{exp为false执行的 ...
- JavaScript流程控制语句脑图
JavaScript流程控制语句脑图 图片是从网上找来的,在这记录一下,以备后面需要的时候查找方便. JavaScript通过规定的语句让有条件的按照一定的方式执行. 分为:循环语句 while do ...
- JavaScript 流程控制-分支
JavaScript 流程控制-分支 1.流程控制 在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能. 简单理解:流程控 ...
- Javascript 流程控制
流程控制 JavaScript通过流程语句来执行程序流,程序流有若干语句组成.在正常情况下,程序中 的语句时按照书写顺序执行的,这种结构称为顺序结构.除了顺序结构之外还有选择结构和循环结构. 1.选择 ...
- JavaScript流程控制及函数
1 流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code...} 双向分支 if (条件表达式){ } else { } <!DOCTYPE html& ...
- javaScript流程控制与函数
流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code... } <!DOCTYPE html> <html> <head> <m ...
- javascript 流程控制及函数
回顾 基本语法 在html的使用 <script></script> 注释 ///* */ 指令结束符 ;换行 输出 console.log()document.write() ...
- JavaScript流程控制语句
一.JavaScript分支语句 -alert() 弹出警告对话框 -prompt() 弹出输入框 1.if(){}else{} 栗子: var num=prompt("请输入电话号码 ...
随机推荐
- ubuntu安装meshlab
ubuntu安装meshlab https://github.com/nine7nine/meshlab.git
- Python3 urllib.parse 常用函数示例
Python3 urllib.parse 常用函数示例 http://blog.51cto.com/walkerqt/1766670 1.获取url参数. >>> from url ...
- Tag recommendaion... 论文中的小例子,使用HOSVD算法推荐
本文内容来自于论文:Tag recommendations based on tensor dimensioanlity reduction 在社会标签系统中,存在三元关系,用户-物品-标签.这些数据 ...
- 为啥final类型的map或者arraylist可以修改数据 而final类型的String变量不可以修改数据呢
比如 final Map map =new HashMap(); 可以往map里put数据final List list =new ArrayList(); 可以往list里 ...
- CentOS7 安装Maven3
下载安装文件 cd /root wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache- ...
- centos 学习总结
我用的是6.4 添加中文输入法 .su root .yum install "@Chinese Support" .exit .回到桌面,system->preference ...
- 学习tomcat(一)----用IDEA调试tomcat源码
一直在使用tomcat,但却不怎么熟悉tomcat的"运作流程",今天就 参照参考文章进行了代码搭建(代码的github在文末),并修改了一些操作.学习下tomcat的" ...
- Centos操作系统配置VIP以及网络
打开虚拟机的网络配置文件 vi /etc/sysconfig/network-script/ifc*** (具体文件根据情况自行填写) 编辑这个文件添加入如下配置 IPADDR=ip地址 (添加VIP ...
- Reporting Service服务SharePoint集成模式安装配置(8、配置用于SharePoint 2010的Reporting service模式)
从SQL Server 2012 起, SQL Server Reporting Service可以完全集成进SharePoint的场,直接作为SharePoint 的组件部分来运行,没有独立的Win ...
- [LeetCode 题解]: Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...