返回顶部
首页 > 资讯 > 精选 >ES6系列之Generator
  • 769
分享到

ES6系列之Generator

2023-06-03 12:06:48 769人浏览 薄情痞子
摘要

一、什么是Generator 函数1.1 语法学习 Generator 语法,你需要了解function* 、yield、next三个基本概念。function* 用来声明一个函数是生成器函数,它比普通的函数声明多了一个*,*的位置比较随意

一、什么是Generator 函数

1.1 语法

学习 Generator 语法,你需要了解function* 、yield、next三个基本概念。

  • function* 用来声明一个函数是生成器函数,它比普通的函数声明多了一个*,*的位置比较随意可以挨着 function 关键字,也可以挨着函数名

  • yield 产出的意思,这个关键字只能出现在生成器函数体内,但是生成器中也可以没有yield 关键字,函数遇到 yield 的时候会暂停,并把 yield 后面的表达式结果抛出去

  • next作用是将代码的控制权交还给生成器函数

// 声明生成器函数function* generator() {    // A    yield 'foo'    // B}// 获取生成器对象let g = generator();// 第一个 next(),首次启动生成器g.next(); // {value: "foo", done: false}// 唤醒被 yield 暂停的状态g.next();// {value: undefined, done: true}

1.2 过程分析

// 分析一个简单例子function* helloGenerator() {   yield "hello";   yield "generator";   return;}var h = helloGenerator();console.log(h.next());//{ value: 'hello', done: false }console.log(h.next());//{ value: 'generator', done: false }console.log(h.next());//{ value: 'undefined', done: true }
  • 创建了h对象,指向helloGenerator的句柄

  • 第一次调用next(),执行到"yield hello",暂缓执行,并返回了"hello"

  • 第二次调用next(),继续上一次的执行,执行到"yield generator",暂缓执行,并返回了"generator"。

  • 第三次调用next(),直接执行return,并返回done:true,表明结束

经过上面的分析,yield实际就是暂缓执行的标示,每执行一次next(),相当于指针移动到下一个yield位置

ES6系列之Generator

总结一下,Generator函数是es6提供的一种异步编程解决方案。通过yield标识位和next()方法调用,实现函数的分段执行

1.3 yield 表达式

yield是Generator函数的暂缓执行的标识,对于yield只能配合Generator函数使用,在普通的函数中使用会报错

Generator函数中还有一种yield*这个表达方式

function* foo(){   yield "a";   yield "b";   }   function* gen(x,y){     yield 1;     yield 2;     yield* foo();     yield 3;   }   var g = gen();   console.log(g.next());//{value: 1, done: false}   console.log(g.next());//{value: 2, done: false}   console.log(g.next());//{value: "a", done: true}   console.log(g.next());//{value: "b", done: true}   console.log(g.next());//{value: "3", done: true}

当执行yield*时,实际是遍历后面的Generator函数,等价于下面的写法:

function* foo(){   yield "a";   yield "b";}function* gen(x,y){    yield 1;    yield 2;        for(var value of foo()){      yield value;    }        yield 3;}

注意:yield 后面只能适配Generator函数

二、Generator应用场景

2.1 异步操作的同步化表达

Generator函数的暂停执行的效果,意味着可以把异步操作写在yield表达式里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield表达式下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数

function* loadUI() {  showLoadingScreen();  yield loadUIDataAsynchronously();  hideLoadingScreen();}var loader = loadUI();// 加载UIloader.next()// 卸载UIloader.next()

上面代码中,第一次调用loadUI函数时,该函数不会执行,仅返回一个遍历器。下一次对该遍历器调用next方法,则会显示Loading界面,并且异步加载数据。等到数据加载完成,再一次使用next方法,则会隐藏Loading界面。可以看到,这种写法的好处是所有Loading界面的逻辑,都被封装在一个函数,按部就班非常清晰

  • 通过Generator函数部署ajax操作,可以用同步的方式表达。

function* main() {  var result = yield request("Http://some.url");  var resp = JSON.parse(result);    console.log(resp.value);}function request(url) {  makeAjaxCall(url, function(response){    it.next(response);  });}var it = main();it.next();

2.2 控制流管理

// 异步函数function getDataAsync (url) {    return new Promise((resolve, reject) => {        setTimeout(() => {            var res = {                url: url,                data: Math.random()            }            resolve(res)        }, 1000)    })}

--结束END--

本文标题: ES6系列之Generator

本文链接: https://lsjlt.com/news/234279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ES6系列之Generator
    一、什么是Generator 函数1.1 语法学习 Generator 语法,你需要了解function* 、yield、next三个基本概念。function* 用来声明一个函数是生成器函数,它比普通的函数声明多了一个*,*的位置比较随意...
    99+
    2023-06-03
  • es6中的generator怎么用
    本篇内容介绍了“es6中的generator怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • ES6 Babel怎么编译Generator
    本篇内容主要讲解“ES6 Babel怎么编译Generator”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ES6 Babel怎么编译Generator”吧!Generatorfunction*...
    99+
    2023-06-05
  • Es6 中Generator函数有什么用
    本篇文章给大家分享的是有关Es6 中Generator函数有什么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ECMAScript 6 (简...
    99+
    2024-04-02
  • ES6 中Generator 函数如何使用
    ES6 中Generator 函数如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Generator ...
    99+
    2024-04-02
  • ES6中Generator函数的示例分析
    这篇文章主要为大家展示了“ES6中Generator函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中Generator函数的示例分析”这篇文...
    99+
    2024-04-02
  • ES6中迭代器、Generator函数怎么用
    小编给大家分享一下ES6中迭代器、Generator函数怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、迭代器之前再聊迭...
    99+
    2024-04-02
  • ES6中Generator自动执行怎么实现
    这篇文章主要讲解了“ES6中Generator自动执行怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ES6中Generator自动执行怎么实现”吧!单个异步任务var fe...
    99+
    2023-06-17
  • ES6中Generator与异步操作的示例分析
    这篇文章主要为大家展示了“ES6中Generator与异步操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中Generator与异步操作的示例...
    99+
    2024-04-02
  • redis系列之-
    什么是主从复制 Redis的主从复制机制是指可以让从服务器(slave)能精确复制主服务器(master)的数据,如下图所示:             或者              主从复制的方式和工作原理 工作方式: Redis主从复制...
    99+
    2017-12-10
    redis系列之-
  • Java系列之Predicate
    Java8引入了许多函数式接口(Functional Interface),Predicate(断言)就是其中一个,它的主要作用可以简单描述为:向其传入一个对象(可以理解为参数),将得到一个布尔值作为...
    99+
    2023-09-01
    java Java8 Optional 断言 函数式编程
  • Flask 系列之 Migration
    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 flask-migrate 实现数据库的迁移操作 实验 安装环境包 pip i...
    99+
    2023-01-31
    系列之 Flask Migration
  • Flask 系列之 Blueprint
    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 学习如何使用 Blueprint 介绍 接触过 DotNet MVC 开发的朋友应该都对...
    99+
    2023-01-31
    系列之 Flask Blueprint
  • Flask 系列之 SQLAlchemy
    SQLAlchemy 是一种 ORM 框架,通过使用它,可以大大简化我们对数据库的操作,不用再写各种复杂的 sql语句 了。 说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv...
    99+
    2023-01-31
    系列之 Flask SQLAlchemy
  • Flask 系列之 FlaskForm
    通过使用 FlaskForm ,可以方便快捷的实现表单处理。 说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 flask_...
    99+
    2023-01-31
    系列之 Flask FlaskForm
  • Flask 系列之 Bootstrap-
    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 Bootstrap-Flask 来进行页面美化,为网站应用上 Bootstra...
    99+
    2023-01-31
    系列之 Flask Bootstrap
  • Flask 系列之 LoginManag
    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 flask-login 进行会话管理的相关操作,并完成用户合法性登陆和退出。 ...
    99+
    2023-01-31
    系列之 Flask LoginManag
  • Flask 系列之 Pagination
    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 实现当前登录用户的事务浏览、添加、删除 操作 实现 首先,在我们的 todolist\f...
    99+
    2023-01-31
    系列之 Flask Pagination
  • Openssl之PEM系列
    Openssl之PEM系列1.PEM编码文件结构介绍PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发送邮件的标准,主要用来将各种对象保存成PEM格式,并将PEM格式的各种对象读取到相应的结构中。它的基本流...
    99+
    2023-06-04
  • OpenStack Juno系列之L3
    OpenStack L3 HA agent and VRRPactive/active此方案描述利用了模块化layer 2 (ML2) 插件与Open vSwitch (OVS) OpenStack对 Networking Layer 3 ...
    99+
    2023-01-31
    系列之 OpenStack Juno
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作