generator是es6推出的解决异步编程的方法之一
1.generator的作用:通过yield可以让函数的执行流程挂起,极大地方便了改变执行流程
2.generator的简单使用和理解
创建Generator函数(就是可以挂起,暂停执行的函数,特点是function后面有一个*)
function* gen(x){
var y = yield x + 2;
return y;
}
下面就开始调用,调用的时候使用next()函数
next方法会执行函数体,直到遇到第一个yield语句,然后挂起函数执行,等待后续调用。但是next会返回一个对象,这个对象有2个key其中value表示yield语句后面的表达式的值,done是个布尔值,表示函数体是否已经执行结束。再次调用g。next时,执行流在挂起的地方继续执行,直到遇到第2个yield,依次类推。
我们可以来看一个简单的例子
function* generator() {
let x=yield 1;
let y=yield 3;
let z=yield 5;
}
var g=generator();
console.log(g.next());
console.log(g.next());
console.log(g.next());
console.log(g.next());
结果是
{ value: 1, done: false }
{ value: 3, done: false }
{ value: 5, done: false }
{ value: undefined, done: true }
3.generator传参
yield里面有需要注意的地方
function* generator(x) {
let y=yield x+1;
console.log(y);
return y;
}
let g=generator(1);
console.log(g.next());
console.log(g.next());
它的值是
{ value: 2, done: false }
undefined
{ value: undefined, done: true }
我们可以看到y的值是undefined
那怎么才能使y获取到yield x+1的值呢
需要我们把第一次获取的值的value值给g.next()当参数
function* generator(x) {
let y=yield x+1;
return y;
}
let g=generator(1);
console.log(g.next(g.next().value));
也就是这样写
4.异步编程
既然generate使用来解决异步编程,那么怎么来一段代码,看看如何解决一步编程的
function asyncfun(v) {
setTimeout(function(){
let r=v+20;
//请求返回后最为next()的参数
console.log(g.next(r));
},500)
}
function* generate() {
//执行请求
let x=yield asyncfun(1);
return x;
}
let g=generate();
g.next();
参考 http://www.ruanyifeng.com/blog/2015/04/generator.html Generator 函数的含义与用法
https://www.cnblogs.com/xiaoniuzai/p/6534417.html
网友评论