【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>

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

相关推荐
傻小胖1 小时前
shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别
javascript·vue.js·ecmascript
王磊鑫1 小时前
计算机组成原理(2)王道学习笔记
笔记·学习
YoloMari2 小时前
组件中的emit
前端·javascript·vue.js·微信小程序·uni-app
CaptainDrake2 小时前
力扣 Hot 100 题解 (js版)更新ing
javascript·算法·leetcode
东京老树根3 小时前
Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)
笔记·学习·excel
追光少年33224 小时前
Learning Vue 读书笔记 Chapter 2
前端·javascript·vue.js·vue3
前端熊猫4 小时前
JavaScript 的 Promise 对象和 Promise.all 方法的使用
开发语言·前端·javascript
傻小胖5 小时前
vue3中自定一个组件并且能够用v-model对自定义组件进行数据的双向绑定
前端·javascript·vue.js
我想学LINUX5 小时前
【2024年华为OD机试】 (C卷,200分)- 机器人走迷宫(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·机器人
觉醒法师5 小时前
JS通过ASCII码值实现随机字符串的生成(可指定长度以及解决首位不出现数值)
开发语言·前端·javascript·typescript