Generator做为状态机与普通状态机的区别及实现

状态机(有限状态交替变化)有限状态自动机,每运行一次 改变一次状态
什么是状态机?
以操作系统中的任务调度为例来说明什么是状态机。在操作系统的任务调度中经常见到状态机,其作用是根据任务的状态和当前资源条件来改变任务的状态。任务的状态和资源的条件就构成了一个状态机,参见下图:
Generator做为状态机与普通状态机的区别及实现_第1张图片

  1. 普通状态机:要依赖于外部的变量,所以导致状态不安全
    代码实现:
 var flag=true;
		function clock(){
		    if(flag){
		        console.log("开",flag)
		    }
		    else{
		        console.log("关",flag)
		    }
		    flag=!flag;
		}
		clock()
		clock()
		clock()
		clock()

输出结果:
在这里插入图片描述
因为其状态机是通过外部变量flag的赋值才得以改变状态机的状态的,所以是依赖于外部的变量的,会导致状态的不安全,代码如下测试,加上改变状态的语句flag=true;,测试结果:

var flag=true;
		function clock(){
		    if(flag){
		        console.log("开",flag)
		    }
		    else{
		        console.log("关",flag)
		    }
		    flag=!flag;
		}
		clock()
		flag=true;
		clock()
		clock()
		clock()

结果:
Generator做为状态机与普通状态机的区别及实现_第2张图片
2.Generator 函数实现的状态机:
状态维护在generator函数内部,外部无法修改,状态是安全的

function* generator_clock(){
		    while(true){
		        console.log("开")
		yield;
		console.log("关")
		yield;
		    
		    }
		}

		var gclock=generator_clock();
		gclock.next();
		gclock.next();
		gclock.next();
		gclock.next();

结果:
Generator做为状态机与普通状态机的区别及实现_第3张图片
tip:generator状态机是generator的一大作用,可以把Generator函数理解为一个状态机,他的内部封装了多个状态,当我们执行Generator函数时,他会返回一个迭代器对象,可以遍历他的内部状态
比如:
function* myGenerator(){
yield “hello”;
yield “world”
return “ending”
}
var mG=myGenerator()
console.log(mG.next())
console.log(mG.next())
console.log(mG.next())
console.log(mG.next())
结果:
{ value: ‘hello’, done: false }
{ value: ‘world’, done: false }
{ value: ‘ending’, done: true }
{ value: undefined, done: true }

你可能感兴趣的:(笔记,前端,javascript,es6)