Generator函数是ES6的一种特殊的函数语法,最大的特点是可以交出函数的执行权(即暂停执行)。Generator函数不同于普通函数,是可以暂停执行的,写法也与普通函数不同,需要在函数名前面加一个星号 " * " 。Generator函数其实就是一个封装好的异步任务,或者说是异步任务的容器。异步操作需要暂停的地方,都需要用yield语法著名。
写法如下:
let x = 100;
function * gen(){
let y = 10;
console.log(x,y);
yield console.log("yield后的内容");
console.log("yield下的内容");
yield console.log("第二个yield后的内容");
yield "第二个yield后的内容";
return 2;
}
let end = gen();
end(); ===> 不会执行
end.next(); ===> 执行到第一个yield所在位置,也就是会输出:10、100、yield后的内容
此时当我们调用end()执行的时候并不会执行函数体中的代码,调用Generator函数会返回一个对象指针,指针上有一个next方法,会移动内部指针指向第一个遇到的yield语句,上例就是执行到第一个yield所在位置即停止。
next方法的作用就是将函数体中的代码分阶段执行。每次调用next方法,会返回一个对象,表示当前阶段的信息(value属性和done属性),value属性的值是对应的yield后的表达式的值,如果表达式没有返回值则值为undefined;done是一个布尔值,代表当前Generator函数是否语句执行完毕。
Generator函数内部可以部署错误处理代码,捕获函数体外抛出的错误。代码如下:
function * gen(x){
try{
let v = yield x + 100;
console.log(v);
}catch(e){
console.log(e); ===> 出错了
}
return v;
}
let generator = gen(1);
generator.next();
generator.throw("出错了");
上面的代码,Generator函数体外,调用throw方法抛出的错误,可以被函数体内的try…catch代码块捕获到。