我们使用js来写一个方法时,除了使用promise来控制进度,函数只有执行完毕和未执行两种状态;在ES6中引入了生成器,使得函数也可以被挂起,我们可以再调用.next()方法使函数继续执行;
生成器函数的声明
//基础的函数声明
function getAge (name) {
if (name === 'bob'){
return 18;
}
return 20;
}
//生成器函数的声明
function *getAge(name) {
//函数内容省略
}
将函数名前增加一个星号,即可声明一个生成器函数;
生成器函数的特性
在生成器函数声明之后,我们直接调用并不会直接执行这个函数,只会将这个函数置于挂起状态
function *getAge(name) {
//函数内容省略
}
getAge()//getAge {<suspended>}
根据提示的内容,这个函数目前处于暂停状态;
如果要将生成器函数执行,需要调用.next方法
getAge().next()//{value: undefined, done: true}
返回值提示函数状态已经由暂停变为完成,函数中并没有指定需要返回的值,所以这个value为undefined;
生成器函数的暂停
如果我们想让生成器函数中有一个“断点”,那么我们需要在函数中写一个yield
function *getAge(name) {
yield
}
let a = getAge()
console.log(a)//getAge {<suspended>}
a.next()//{value: undefined, done: false}
a.next()//{value: undefined, done: true}
console.log(a)//getAge {<closed>}
这里需要注意一点,不能直接使用getAge().next().next(),getAge().next()返回的对象中,并没有.next()方法;但是我们可以将这个函数的执行赋值给一个变量,这个变量的类型就是一个生成器,通过调用这个变量的方法来实现跟踪生成器函数的状态;
在刚开始时,a的状态为暂停,通过执行next方法,状态变为done:false;这是因为我们在函数内部加入了yield,函数在这里暂停了;再执行next方法,断点从这里跳过,完成状态就变成了true;