Es6系列之generator基础篇

简介:

Ecmascript 6简称es6,是javascript下一代标准,还处在开发阶段,估计2014年底发布,有关更多浏览器对es6的支持情况,点击这里

今天说说es6里新增的Generators.

下面是Generator系列的相关文章链接


Generator

generator简单的说就是提供了一种控制函数内部执行状态的功能,以往的普通函数只要开始执行则就不能中止,而generator函数不一样,提供了一种可以中止函数的手段,下面说说它的一般用法.

  • function* 这是定义generator函数的语法
  • yield 定义在函数内部实现不同的状态

看下面一个简单的例子

function* build(){
    yield 'step1';
    yield 'step2';
    yield 'step3';
    return 'done';
}

var generator = build();
generator.next();  // => {value: 'step1', done: false}
generator.next();  // => {value: 'step2', done: false}
generator.next();  // => {value: 'step3', done: false}
generator.next();  // => {value: 'done', done: true}

首先我们执行generator函数来生成一个待遍历的函数,然后不断调用next方法来执行,它将返回一个对象包含value, done两个属性,前者是函数体内yield后面的值,后者代表函数遍历是否完成.

这里重点说下yield关键字

每次调用next方法时函数体内都会停留在碰到的下一个yield关键字那,并把关键字后面的内容作为返回值,下一次再调用next方法重复上面的操作直到最后没有遇到yield为止.假如函数体内不包含任何一个yield,则生成的遍历函数只是一个延迟执行的函数而以,像下面这样的

function* delay(){
    return 'hello feenan';
}

var iterator = delay();

iterator.next(); // => {value: 'hello feenan', done: true}
iterator.next(); // => {value: undefined, done: true}

另外yield表达式还可以返回值用来在下一个next里调用,返回值只能通过next函数来传递,不过第一次调用next时传递参数无效,因为在它之前不存在yield,看下面的例子

function * build(){
    yield 'step1';
    var step = yield 'step2';
    if(step == 3){
        yield 'step3';
    }else{
        yield 'step4';
    }
    yield 'step5';
    return '执行完毕!';
}

var generator = build();
console.log(generator.next());  // => {value: 'step1', done: false}
console.log(generator.next());  // => {value: 'step2', done: false}
console.log(generator.next(3));  // => {value: 'step3', done: false}
console.log(generator.next());  // => {value: 'step5', done: false}
console.log(generator.next());  // => {value: '执行完毕', done: true}

注意: next传递的参数值是传递给上一次yield表达式,所以上面例子里第三次调用next传递参数其实是把值传递给第二个yield表达式

generator 将会用在什么地方呢?

上面说了这么多generator的用法,那么它可以用在什么地方呢

  • 假如一个动作可以分成多步进行,并且想控制每步的时间的时候可以用generator函数

总结

今天只是简单的介绍generator的用法,更多的问题其实都没有说

  • 假如yield后面是异步函数怎么办?
  • 怎么处理yield的异常情况

这个以后会另起一篇文章你介绍,请保持关注.

本文参考这篇文章

The Basics Of ES6 Generators


目录
相关文章
|
编解码 Android开发 iOS开发
airserver软件激活码mac版
AirServer 可以方便的利用 AirPlay, Google Cast 以及 Miracast 等技术,将 iPhone, iPad, Mac, Android, Nexus, Pixel, Chromebook, 以及 PC 上面的内容投影到更大的屏幕上面,从而更好的促进协作。
7315 0
|
自然语言处理 数据可视化 API
淘宝商品评论 API 接口:深度解析用户评论,优化产品与服务
淘宝是领先的中国电商平台,其API为开发者提供商品信息、交易记录及用户评价等数据访问服务。对于获授权的开发者和商家,可通过申请API权限、获取并解析评论数据来进行情感分析和统计,进而优化产品设计、提升服务质量、增强用户互动及调整营销策略。未授权用户可能受限于数据访问。
|
编译器 C++
VS /PROFILE(性能工具探查器)的使用
VS /PROFILE(性能工具探查器)的使用
350 0
|
弹性计算 监控 数据可视化
快速部署 Grafana 社区版
Grafana是一个开源数据可视化和监控平台,为实时监控、数据分析和可视化提供强大的仪表板和图表功能。本文介绍用计算巢快速部署Grafana社区版。
快速部署 Grafana 社区版
|
编解码 弹性计算 运维
AWS无服务器直播解决方案
AWS无服务器直播解决方案
|
存储 数据采集 监控
量化交易开发正式版丨量化交易系统开发策略项目/指南功能/方案需求/案例设计
量化交易系统开发策略的指南可以涵盖以下几个关键方面:
二次元风格个人导航网站源码
二次元风格个人导航网站源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
371 1
|
安全 API 数据处理
Android 15革命来袭:64位时代的大门轰然开启,开发者和用户将何去何从?
【8月更文挑战第20天】随着性能提升,Android 15的重大更新引领64位时代,提供更大内存支持、更快执行速度及增强安全性。新版本淘汰32位应用,优化系统库,并改善内存管理。开发者需适应64位开发,面对应用体积增大等挑战,同时享受更高效能。此转变标志着移动应用开发步入新阶段,为用户带来更流畅安全的体验。
975 0
|
Java 测试技术 数据库连接
基于SSM框架实现的快递配送平台
基于SSM框架实现的快递配送平台
211 2
|
Linux 开发者 Windows
Windows、Linux 和 Mac:操作系统之间的区别
Windows系统、Linux系统与Mac系统:操作系统的对比与选择 操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。以下是Windows 系统、Linux 系统、Mac 系统的对比: