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

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

相关推荐
伍哥的传说15 分钟前
Vue 3.5重磅更新:响应式Props解构,让组件开发更简洁高效
前端·javascript·vue.js·defineprops·vue 3.5·响应式props解构·vue.js新特性
德育处主任26 分钟前
p5.js 3D 形状 "预制工厂"——buildGeometry ()
前端·javascript·canvas
Mintopia28 分钟前
React 牵手 Ollama:本地 AI 服务对接实战指南
前端·javascript·aigc
Mintopia1 小时前
Next.js 全栈开发基础:在 pages/api/*.ts 中创建接口的艺术
前端·javascript·next.js
xvmingjiang1 小时前
Element Plus 中 el-input 限制为数值输入的方法
前端·javascript·vue.js
狂炫一碗大米饭1 小时前
事件委托的深层逻辑:当冒泡不够时⁉️
javascript·面试
张柏慈2 小时前
JavaScript性能优化30招
开发语言·javascript·性能优化
pepedd8642 小时前
全面解析this-理解this指向的原理
前端·javascript·trae
渔夫正在掘金2 小时前
神奇魔法类:使用 createMagicClass 增强你的 JavaScript/Typescript 类
前端·javascript
雲墨款哥2 小时前
一个前端开发者的救赎之路-JS基础回顾(三)-Function函数
前端·javascript