【es6复习笔记】生成器(11)

什么是生成器函数

生成器函数是一种特殊的函数,它可以在执行过程中暂停并保存当前状态,然后在需要时恢复执行。生成器函数通过 yield 关键字来实现暂停和恢复执行的功能。

生成器函数的基本用法

  1. 定义生成器函数 :使用 function* 关键字来定义生成器函数。
  2. 使用 yield 关键字 :在生成器函数中使用 yield 关键字来返回一个值,并暂停函数的执行。
  3. 创建迭代器对象:通过调用生成器函数来创建一个迭代器对象。
  4. 使用 next() 方法 :使用迭代器对象的 next() 方法来恢复生成器函数的执行,并获取下一个值。

生成器函数的实例

实例 1:基本的生成器函数

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生成器</title>
</head>
<body>
    <script>
        // 生成器函数
        function* gen() {
            yield '一只没有耳朵';
            yield '一只没有尾巴';
            yield '真奇怪';
        }

        // 创建迭代器对象
        let iterator = gen();

        // 使用 next() 方法获取值
        console.log(iterator.next()); // { value: '一只没有耳朵', done: false }
        console.log(iterator.next()); // { value: '一只没有尾巴', done: false }
        console.log(iterator.next()); // { value: '真奇怪', done: false }
        console.log(iterator.next()); // { value: undefined, done: true }
    </script>
</body>
</html>

实例 2:使用生成器函数实现异步操作

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生成器函数实例</title>
</head>
<body>
    <script>
        // 模拟异步获取数据
        function getUsers() {
            setTimeout(() => {
                let data = '用户数据';
                iterator.next(data);
            }, 1000);
        }

        function getOrders() {
            setTimeout(() => {
                let data = '订单数据';
                iterator.next(data);
            }, 1000);
        }

        function getGoods() {
            setTimeout(() => {
                let data = '商品数据';
                iterator.next(data);
            }, 1000);
        }

        // 生成器函数
        function* gen() {
            let users = yield getUsers();
            let orders = yield getOrders();
            let goods = yield getGoods();
        }

        // 创建迭代器对象并开始执行
        let iterator = gen();
        iterator.next();
    </script>
</body>
</html>

实例 3:使用生成器函数处理回调地狱

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生成器函数实例</title>
</head>
<body>
    <script>
        // 异步函数
        function one() {
            setTimeout(() => {
                console.log(111);
                iterator.next();
            }, 1000);
        }

        function two() {
            setTimeout(() => {
                console.log(222);
                iterator.next();
            }, 2000);
        }

        function three() {
            setTimeout(() => {
                console.log(333);
                iterator.next();
            }, 3000);
        }

        // 生成器函数
        function* gen() {
            yield one();
            yield two();
            yield three();
        }

        // 创建迭代器对象并开始执行
        let iterator = gen();
        iterator.next();
    </script>
</body>
</html>

生成器函数的参数传递

生成器函数可以接受参数,并且可以在 yield 表达式中使用这些参数。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生成器函数参数</title>
</head>
<body>
    <script>
        function* gen(arg) {
            console.log(arg);
            let one = yield 111;
            console.log(one);
            let two = yield 222;
            console.log(two);
            let three = yield 333;
            console.log(three);
        }

        // 执行生成器函数并传递参数
        let iterator = gen('AAA');
        console.log(iterator.next());
        console.log(iterator.next('BBB'));//next中传入的BBB将作为yield 111的返回结果
        console.log(iterator.next('CCC'));//next中传入的CCC将作为yield 222的返回结果
        console.log(iterator.next('DDD'));//next中传入的DDD将作为yield 333的返回结果
    </script>
</body>
</html>

通过以上实例,你可以看到生成器函数在处理异步操作和避免回调地狱方面的强大能力。希望这些教程对你有所帮助!

相关推荐
小小前端--可笑可笑19 小时前
Vue / React 单页应用刷新 /login 无法访问问题分析
运维·前端·javascript·vue.js·nginx·react.js
半壶清水19 小时前
[软考网规考点笔记]-OSI参考模型与TCP/IP体系结构
网络·笔记·tcp/ip
小林敲代码778819 小时前
记一次 Vue 项目首屏优化:从 7.1s 到 0.9s,深挖 Gzip 的力量
前端·javascript·vue.js
Highcharts.js20 小时前
什么是向量图表?如何用 Highcharts 快速创建一个笛卡尔坐标图/矢量图?
javascript·开发文档·highcharts·图表开发·向量图·矢量图表·笛卡尔坐标图
脱离语言20 小时前
Jeecg3.8.2 前端经验汇总
开发语言·前端·javascript
NEXT0621 小时前
useMemo 与 useCallback 的原理与最佳实践
前端·javascript·react.js
小爱丨同学21 小时前
React-Context用法汇总 +注意点
前端·javascript·react.js
木易 士心1 天前
ESLint 全指南:从原理到实践,构建高质量的 JavaScript/TypeScript 代码
javascript·ubuntu·typescript
前端达人1 天前
都2026年了,还在用Options API?Vue组合式API才是你该掌握的“正确姿势“
前端·javascript·vue.js·前端框架·ecmascript
浅念-1 天前
C++ :类和对象(4)
c语言·开发语言·c++·经验分享·笔记·学习·算法