ES6之生成器

简介: ES6之生成器



前言

生成器


一、生成器是什么?

生成器就是一个特殊的函数,实现异步编程。格式function *名称(){...}

(这个*靠近function写,靠近名称写,或者两边空格都不靠近均正确)

二、生成器

  1. 生成器函数声明比较特殊:特殊在声明用*,而且该函数有iterator实现接口,是迭代器对象
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function* dr() {
            console.log("a");
        }
        let iterator = dr();
        console.log(iterator);
    </script>
</body>
</html>

  1. 生成器执行用next
function* dr() {
            console.log("a");
            console.log("b");
        }
        let iterator = dr();
        iterator.next();

  1. 生成器函数执行后的返回对象
    既然上面说它是迭代器对象,它调用next的工作原理跟迭代器的相似:next每调用一次,指针就往后移动一位;返回的是包含value,done属性的对象。
    只不过它的next移动只有函数里设置yield时,才会实现next分层执行(可以理解为yield是函数代码分隔符,下面的代码:yield “111”,yield "222"把代码分成三部分,第一部分是yield "111"及上面,第二部分是yield "111"与yield “222"之间包括yield"222”,第三部分是yield "222"下面)。
    否则默认全部为一次执行(即上面的图片执行结果)
    (如果对迭代器不熟的,可以看我上篇文章)
    next的返回结果的value是yield的值
    next调用时,就是每调用一次运行上面所说的分成的部分
function* dr() {
            console.log("a");
            yield "111";
            console.log("b");
            yield "222";
            console.log("c");
        }
        let iterator = dr();
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next());

  1. 生成器传参(生成器函数传参和next传参)
    注意:next传参是改变上一个yield … 的返回结果
function* dr(arg) {
            console.log(arg);
            let one = yield "111";
            console.log(one);
            yield "222";
            console.log("c");
        }
        let iterator = dr("aaa");
        console.log(iterator.next());
        console.log(iterator.next("bbb"));
        console.log(iterator.next());

  1. 实例
    模拟:1s后获取用户数据,2s后获取订单信息,3s后获取商品信息
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function getUsers() {
            setTimeout(() => {
                let data = "用户数据";
                iterator.next(data);
            }, 1000)
        }
        function getOrders() {
            setTimeout(() => {
                let data = "订单信息";
                iterator.next(data);
            }, 2000)
        }
        function getGoods() {
            setTimeout(() => {
                let data = "商品数据";
                iterator.next(data);
            }, 3000)
        }
        function* dr() {
            let user = yield getUsers();
            console.log(user);
            let order = yield getOrders();
            console.log(order);
            let good = yield getGoods();
            console.log(good);
        }
        let iterator = dr();
        iterator.next();
    </script>
</body>
</html>


总结

以上就是生成器的介绍,希望对大家有所帮助。

相关文章
|
8月前
|
前端开发
ES6之生成器(Generator)
生成器(Generator)是ES6引入的一种特殊的函数,它可以通过yield关键字来暂停函数的执行,并返回一个包含value和done属性的对象。生成器的概念、作用和原理如下所述:
78 0
|
2月前
|
JavaScript 前端开发
ES6 迭代器和生成器
总的来说,ES6 迭代器和生成器为 JavaScript 提供了更强大的遍历和控制能力,使代码更加灵活和高效。
30 1
|
3月前
|
自然语言处理 前端开发
如何理解 ES6 中 Generator ?
【10月更文挑战第7天】
|
8月前
ES6学习之对象
ES6学习之对象
|
8月前
|
JavaScript 前端开发
js开发:请解释什么是ES6的Generator函数,以及它的用途。
ES6的Generator函数是暂停/恢复功能的特殊函数,利用yield返回多个值,适用于异步编程和流处理,解决了回调地狱问题。例如,一个简单的Generator函数可以这样表示: ```javascript function* generator() { yield &#39;Hello&#39;; yield &#39;World&#39;; } ``` 创建实例后,通过`.next()`逐次输出&quot;Hello&quot;和&quot;World&quot;,展示其暂停和恢复的特性。
53 0
ES6学习(九)—Generator 函数的语法
ES6学习(九)—Generator 函数的语法
ES6 从入门到精通 # 15:生成器 Generator 的用法
ES6 从入门到精通 # 15:生成器 Generator 的用法
111 0
ES6 从入门到精通 # 15:生成器 Generator 的用法
|
JavaScript 测试技术
基于node.js开发的文章生成器(六、网页版本的文章生成器--工整优化篇)
# 引言 前面我们已经学完了基于express框架下服务器的启动,get请求的接收与处理还有post请求的接收与处理。同时我们使用接口测试工具完成了接口的测试,响应值和接受值返回值都是正常的。那么为什么还有这一章节呢? # 问题的提出 原来我们之前对于get请求和Post请求的接受与处理,虽然可以实现其功能,但是整体代码都是写在一个js文件中的,这就导致我们js文件很臃肿,很难看,维护和开发成本都会大大的提高。 那么我们有没有一种方法,让我们的代码工整性和复用性都大大提高呢? # 解决的思路 我的解决方案是:抽成模块,进行模块化开发。 # 实例 还是拿我们之前的cs.js作为讲解。
|
JSON JavaScript 测试技术
基于node.js开发的文章生成器(五、网页版本的文章生成器--准备篇)
# 引言 这次我们来做网页版文章生成器,首先我们学习一些node.js开发服务器的入门知识。 # 框架的使用与导入 因为node原生开发服务器较麻烦,这里我们采用express框架来开发。 首先我们调出控制台,在控制台中输入 npm i express 然后等待一会儿,我们下载完express之后,通过 import express from 'express';导入 express 模块。 因为我们本项目采取的ES Moudle模块,所以这里我们使用import完成导入。 接下来通过定义app完成初始化 `const app = express();` 之后调用 app中的