您的位置:首页 > Web前端 > JavaScript

ES6-Generator函数

2017-12-28 18:58 120 查看
普通函数:最大特点就是函数一路执行到底,中间不会暂停执行

Generator函数:是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。Generator 是生成器的意思。

1.普通 函数

function sum1(a,b) {
return a+b;
}
console.log(sum1(1, 2));


2.Generator 函数

1.函数名之前要加星号,以示区别

2.获取生成器函数对象(即遍历器对象)

3.调用next函数一步一步执行

/**
* 1.定义生成器-函数
* @param a
* @param b
*/
function *sum2(a,b) {
console.log('第一步:',a,b);

yield ; // 函数执行到这里会暂停
console.log('第二步:',a,b);

yield ; // 函数执行到这里会暂停
console.log('第三步:',a,b);

}
/**
* 2.获取生成器函数对象(即遍历器对象)
*/
var generatorObj=sum2(1,2);

/**
* 3.执行函数,每调用一次next函数yield都会返回一个结果:
* {value: undefined, done: false}
*/
var value1=generatorObj.next(); // 调用next函数,执行第一步中的代码
console.log(value1);//{value: undefined, done: false}
var value2=generatorObj.next(); // 调用next函数,执行第二步中的代码
console.log(value2);//{value: undefined, done: false}
var value3=generatorObj.next(); // 调用next函数,执行第三步中的代码
console.log(value3);//{value: undefined, done: true}


每次调用 next 方法,会返回一个对象
{value: undefined, done: false}
,表示当前阶段的信息( value 属性和 done 属性)。value 属性是 yield 语句后面表达式的值,表示当前阶段的值;done 属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段

3.yield 语句接收next中的参数

yield  是一个语句,执行到这里的代码会暂停。


注意:第一次调用next的时候传递参数无效

/**
* 1.定义生成器-函数
* @param a
* @param b
*/
function *sum2(a,b) {
console.log('第一步参数:');// 打印结果:第一步参数:

var value2 = yield ; //value2 是接收第二个next函数传递的参数
console.log('第二步接收的参数:'+value2);//打印结果:第二步接收的参数:value2

var value3 = yield ; //value3 是接收第三个next函数传递的参数
console.log('第三步接收的参数:'+value3); //打印结果:第三步接收的参数:value3

}
/**
* 2.获取生成器函数对象
*/
var generatorObj=sum2(1,2);

var value1=generatorObj.next('value1'); // 调用next函数,传递的参数无效
console.log(value1); //{value: undefined, done: false}
var value2=generatorObj.next('value2');// 传递value2参数
console.log(value2); //{value: undefined, done: false}
var value3=generatorObj.next('value3'); // 传递value3参数
console.log(value3); // {value: undefined, done: true}


4.yield 语句后面表达式的值

next函数的返回值 是yield语句后面表达式的值

/**
* 1.定义生成器-函数
* @param a
* @param b
*/
function *sum2(a,b) {
var result1='第一步产生的结果'
yield result1 ; // 把第一步产生的结果返回给第一个next函数

var resul2='第二步产生的结果'
yield resul2; // 把第二步产生的结果返回给第二个next函数

var resul3='第三步产生的结果'
return resul3; //把第三步产生的结果返回给第三个next函数

}
/**
* 2.获取生成器函数对象
*/
var generatorObj=sum2(1,2);

var value1=generatorObj.next(); //获取第一个yield语句返回的值
console.log(value1); //{value: 第一步产生的结果, done: false}
var value2=generatorObj.next(); //获取第二个yield语句返回的值
console.log(value2); //{value: 第二步产生的结果, done: false}
var value3=generatorObj.next(); //获取最后retrun返回的值
console.log(value3); // {value: 第三步产生的结果, done: true}


5. yield 语句的接收参数和返回值

下面这个案例演示:yield 语句的接收参数+1后作为返回值给next

/**
* 1.定义生成器-函数
* @param a
* @param b
*/
function *sum2(a) {
var value1Value=yield a ; // a 会赋值给第一个next函数的返回值中;value1Value接收的是第二个next函数中的参数

var value2Value=yield value1Value+1; //第二个next函数中的参数+1之后赋值给第二个next函数的返回值中;value2Value接收的是第三个next函数中的参数

return value2Value+1;//第三个next函数中的参数+1之后赋值给第三个next函数的返回值中;
}
/**
* 2.获取生成器函数对象
*/
var generatorObj=sum2(1);

var value1=generatorObj.next();
console.log(value1.value); //  1
var value2=generatorObj.next(value1.value);
console.log(value2.value); // 2
var value3=generatorObj.next(value2.value);
console.log(value3.value); // 3


最后留个问题:如果 yield 语句的前后都是Promise对象会发生什么有趣的事情??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息