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

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

相关推荐
firewood202421 分钟前
共射三极管放大电路相关情况分析
笔记·学习
xkxnq33 分钟前
第五阶段:Vue3核心深度深挖(第74天)(Vue3计算属性进阶)
前端·javascript·vue.js
Hello_Embed37 分钟前
libmodbus STM32 主机实验(USB 串口版)
笔记·stm32·学习·嵌入式·freertos·modbus
三小河40 分钟前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
Hilaku1 小时前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
risc1234561 小时前
思维脚手架
笔记
三小河1 小时前
前端视角详解 Agent Skill
前端·javascript·后端
risc1234561 小时前
只身走过多少的岁月,弹指一梦不过一瞬间
笔记
颜酱1 小时前
二叉树遍历思维实战
javascript·后端·算法
鹏多多1 小时前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js