ES6-Generator函数
2017-12-28 18:58
120 查看
普通函数:最大特点就是函数一路执行到底,中间不会暂停执行
Generator函数:是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。Generator 是生成器的意思。
2.获取生成器函数对象(即遍历器对象)
3.调用next函数一步一步执行
每次调用 next 方法,会返回一个对象
注意:第一次调用next的时候传递参数无效
最后留个问题:如果 yield 语句的前后都是Promise对象会发生什么有趣的事情??
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对象会发生什么有趣的事情??
相关文章推荐
- es6 作为对象属性的Generator函数
- 遍历完全二叉树(ES6的Generator函数)
- es6 Generator函数的this
- es6 Generator函数的含义
- ES6的Generator函数
- es6基础回顾--Generator函数
- ES6笔记 - Generator函数
- es6 Class 的 Generator函数
- ES6入门之Generator函数
- ES6学习—Generator函数
- ES6中的Generator函数
- es6 Generator函数的语法
- es6的generator函数
- ES6 Generator函数
- ES6笔记 - Generator函数
- 谈谈 ES6 的 Promise 对象
- ES6笔记(1) -- 环境配置支持
- ES6折腾记- let/const块级变量及块作用域
- 如何解决ES6基础语法不支持的问题。
- 什么时候不该使用es6箭头函数