ECMAScript 2019 中的 Generator 函数:使用手册

Generator 函数是一种特殊的函数,在 ECMAScript 2015 中被引入。这种函数不像普通函数一样运行到底就返回,而是可以暂停执行,并且可以根据需要再次开始执行。在 ECMAScript 2019 中,Generator 函数有了更多的特性和用法,本文将详细介绍如何使用它们。

基本语法和工作原理

定义 Generator 函数的语法非常简单,就是在函数关键字 function 后面加上一个星号。

--------- ----------- -
  -- ---- ---- ----
-

调用 Generator 函数并不会立即执行函数体内的代码,而是返回一个指向内部状态的迭代器对象,也就是说函数内部的代码只有在迭代器的 next() 方法被调用时才会执行。

----- -------- - ------------
----- ------ - ----------------
-------------------- -- - ------ ---------- ----- ---- -

在第一次调用 next() 方法时,Generator 函数内部的代码会运行到第一个 yield 语句处,然后将 yield 后面的值返回给 next() 方法,并将函数运行状态作为 done 属性一起返回。再次调用 next() 方法时,函数将从上次停下的位置继续执行,直到运行完所有代码或者遇到下一个 yield 语句为止。

--------- ----------- -
  ---------------------
  ----- -- -- - - -----------
  ----------------------
  ----- -- -- - - -----------
  ---------------------
  ----- -- -- - - -----------
-

----- -------- - ------------
----------------------------- -- - ------ -- ----- ----- -
----------------------------- -- - ------ -- ----- ----- -
----------------------------- -- - ------ -- ----- ----- -
----------------------------- -- - ------ ---------- ----- ---- -

在最后一次调用 next() 方法时,Generator 函数返回的值是 { value: undefined, done: true },也就是说函数已经运行到底部并且没有再返回任何值了。

使用 yield*

在 Generator 函数中,yield 后面可以调用其他的 Generator 函数,这种语法被称作 yield*。使用 yield* 关键字时,Generator 函数会暂停自己并且执行被调用的 Generator 函数,待调用的函数运行结束后,控制权回到原始的 Generator 函数中,以便将结果值返回给调用者。

--------- ------------ -
  ----- ----
  ------ -------------
  ----- ----
-

--------- ------------ -
  ----- ----
-

----- -------- - -------------
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---------- ----- ---- -

在这个例子中,当 generator1() 函数执行到 yield* generator2() 的时候,它会暂停执行,然后开始运行 generator2() 函数。当 generator2() 函数执行完毕之后,控制权回到 generator1() 函数中,并且从上次暂停的位置继续运行。

使用参数和返回值

Generator 函数可以接受参数并且返回值,这些特性都很容易使用。

--------- ---------------- -
  ----- ------ - ----- ----- - --
  ----- ------ - --
-

----- -------- - -------------
----------------------------- -- - ------ -- ----- ----- -
------------------------------ -- - ------ -- ----- ----- -
----------------------------- -- - ------ ---------- ----- ---- -

在这个例子中,当我们调用 generator(1) 时,我们将 1 作为参数传递给了 Generator 函数。当我们第一次调用 next() 方法时,代码运行到 yield value + 1 处,将 2 作为 value 变量的值返回,此时控制权返回给调用者,我们可以将任何值通过第二次调用 next() 方法的参数传递给 result 变量,在这个例子中我们传递了 2。最后一次调用 next() 方法将代码运行到结尾并且返回 { value: undefined, done: true }

实战应用:生成器函数与 Promise

在实际应用中,Generator 函数可以非常方便地与 Promise 结合使用,以实现异步任务的序列化执行。

-------- -------------- -
  ------ --- ----------------- ------- -- -
    ------------- -- -
      ------------- ---- ---------
    -- ------
  ---
-

--------- ----------- -
  ----- ----- - ----- --------------------------------------
  -------------------
  ----- ----- - ----- --------------------------------------
  -------------------
-

-------- ----------------------- -
  ----- -------- - ------------

  -------- -------------------- -
    -- ------------- -
      ------ ------------------------------
    -

    ------ ------------------------ -- -
      ------ ----------------------------------
    ---------------- -- -
      ------ ----------------------
    ---
  -

  ------ ------------------------------
-

------------------------------------- -- -
  --------------------
---------------- -- -
  ---------------------
---

在这个例子中,我们定义了一个 fetchData() 函数,它返回一个 Promise 对象,在一秒钟后解析为一个字符串。然后我们定义了一个 generator() 函数,它使用 yield 语句依次调用两次 fetchData() 函数,并且在每次调用时打印返回的数据。最后我们定义了一个 runGenerator() 函数,它将执行 generator() 函数,然后在每次执行 fetchData() 函数时使用 Promise 对象传递数据和控制权,以便实现异步任务的序列化执行。

总结

Generator 函数是一种强大的函数,可以让我们使用类似于普通的同步代码的方式编写异步任务。本文介绍了 Generator 函数的基本语法和工作原理,以及如何使用 yield*、参数和返回值。最后我们还通过一个实际应用案例展示了如何将 Generator 函数与 Promise 结合使用。如果你想进一步学习 Generator 函数的使用,可以参考 MDN 的文档。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64852ade48841e9894414eb8


猜你喜欢

  • 在 ES11 中使用空值联合运算符

    在 JavaScript 中,空值(null 或 undefined)常常在变量或属性中出现。空值联合运算符是 ES11 中的新功能,也被称为空合并操作符(nullish coalescing ope...

    1 年前
  • Web 应用程序中使用 Sequelize ORM 创建和查询数据

    什么是 Sequelize ORM? Sequelize 是一个流行的基于 Node.js 的 ORM(Object-Relational Mapping)框架,它提供了强大的功能来操作数据库(如 M...

    1 年前
  • 使用 Angular 的 HTTP 拦截器统一处理请求与响应

    介绍 在前端开发中,通过 HTTP 请求获取数据已经成为必不可少的功能。然而,HTTP 请求和响应往往需要进行很多共同处理,例如添加统一的请求头、对返回的数据进行预处理等等。

    1 年前
  • Hapi.js 中的单元测试和集成测试实践

    Hapi.js 是一款 Node.js 框架,旨在构建可伸缩的 Web 应用程序。作为一名前端开发者,我们常常需要进行单元测试和集成测试以确保代码的质量和可靠性。本文将介绍如何在 Hapi.js 中实...

    1 年前
  • ESLint 如何忽略单个规则

    ESLint 如何忽略单个规则 在前端开发中,我们经常使用 ESLint 工具来规范代码质量,但在实际开发中,某些情况下我们需要忽略某些规则,这时候该怎么做呢? ESLint 提供了几种方法来忽略单个...

    1 年前
  • Webpack 打包时自动插入版本号的实现

    在前端开发中,我们经常需要对静态资源进行版本管理,例如 js、css、图片等。为了防止浏览器缓存,我们通常会在文件名中加入版本号,并在每次更新时手动修改版本号,但这样不仅麻烦,还容易出错。

    1 年前
  • Kubernetes 中 ConfigMap 和 Secret 的使用详解

    Kubernetes 是一个流行的容器编排系统,它可以帮助用户自动化部署、扩展和管理应用程序。在 Kubernetes 中,ConfigMap 和 Secret 是两个非常重要的概念。

    1 年前
  • CSS Grid 和 CSS Flexbox:你需要知道的比较

    前言 在 Web 开发中,布局是一个非常重要的环节。好的布局能够使网页更加美观、易读和易用。而 CSS Grid 和 CSS Flexbox 这两种 CSS 布局方式,近年来越来越受到前端开发者的青睐...

    1 年前
  • SSE 如何取消订阅?

    Server-Sent Events(SSE)是一种允许服务器向客户端推送实时数据的技术。在前端领域,SSE 可以用于构建实时的聊天室、股票行情等实时数据展示场景。

    1 年前
  • ECMAScript 2021 中的 Numeric Separators:使数字更易读

    ECMAScript 2021 中的 Numeric Separators:使数字更易读 在编写 JavaScript 代码时,经常需要使用数字来进行计算和操作。而很多时候数字特别大或者特别小,很难一...

    1 年前
  • 如何在 Chai 中测试 Mock 数据和自定义数据类型

    在前端开发中,测试是非常重要的一环。用 TDD(测试驱动开发)方式来开发,可以更加保证代码的质量。Chai 是一个流行的 JavaScript 测试库之一,它可以帮助我们编写和运行测试用例,并对测试结...

    1 年前
  • Vue.js 开发中遇到的兼容性问题及解决方案

    在前端开发过程中,Vue.js 已经成为了一种非常流行的选择。然而,在开发过程中,我们经常会遇到一些兼容性问题,这些问题经常会让我们的代码出现一些奇怪的行为,并且会使开发过程变得更加麻烦。

    1 年前
  • 实现基于 Scrum 的 SPA 应用开发流程及故障维护方案

    前言 随着互联网技术的迅速发展,越来越多的网站和应用转向了单页应用(Single Page Application, SPA)的开发模式。相比传统多页应用,SPA 可以更好地实现流畅的交互体验和快速的...

    1 年前
  • 如何使用 SASS 编写多列布局

    如何使用 SASS 编写多列布局 SASS 是 CSS 预处理器中的一种,它可以使我们在编写样式表时,让代码更易于维护和拓展。在多数情况下,CSS 代码只能以线性方式编写,这样会造成代码的不直观、难以...

    1 年前
  • Enzyme: 如何测试使用 Prop Getter 形式的 React 组件

    引言 在 React 开发中,我们经常会编写许多组件来构建我们的 UI 界面。然而,如何确保我们的组件在不断变化的业务需求下,保持稳定的功能和正确的渲染,是一个需要重视的问题。

    1 年前
  • Deno 中如何实现断点续传

    背景 在进行文件传输时,常常会遇到由于各种原因中断传输的情况。若要再次传输,通常需要重新开始传输,浪费时间和带宽资源。一种有效的解决方案是实现断点续传功能,即能够在传输中断后,从断点处继续传输,从而提...

    1 年前
  • LESS 中的 rem 单位使用方法详解

    LESS 中的 rem 单位使用方法详解 在 Web 前端设计中,CSS 样式的编写是最为基础也是最为重要的部分之一。而在 CSS 样式的编写过程中,使用正确的单位和值来进行设定和调整,将会直接决定网...

    1 年前
  • ES7 实践:使用 Map 和 reduce 优化数据分析代码

    在前端开发中,处理大量数据是很常见的需求。通常情况下,我们会使用循环和条件语句来进行数据的遍历和分析。然而,这种方式往往会导致代码量过多、难以维护和调试等问题。ES7 中增加了一些新的方法,如 Map...

    1 年前
  • 在 Cypress 测试中使用日期和时间

    Cypress 是一个功能强大的前端端对端自动化测试框架,它可以帮助开发人员在不需要手动点击和输入的情况下快速构建和自动化测试 Web 应用程序。在测试过程中,经常需要使用日期和时间来测试数据的有效性...

    1 年前
  • RxJS 中 switchMap 操作符使用原则详解

    RxJS 是一种流式编程库,它允许我们以响应式方式创建和处理异步数据流。在 RxJS 中,switchMap 是一个非常有用的操作符,它允许我们在响应式数据流中切换,以便在一个事件触发时切换到另一个 ...

    1 年前

相关推荐

    暂无文章