file-type

深入理解ES6 Generator函数:应用与实例解析

PDF文件

58KB | 更新于2024-08-28 | 90 浏览量 | 0 下载量 举报 收藏
download 立即下载
"本文深入探讨了ES6中的Generator函数,这是一种用于异步编程的重要工具。Generator函数通过在函数声明前加上星号(*)来标识,并且内部使用yield表达式来控制执行流程。执行Generator函数并不立即执行函数体内的代码,而是返回一个实现了iterator接口的指针,即一个iterator对象。这个对象可以通过调用next方法来逐步执行函数体并获取yield表达式的值。" Generator函数是ES6引入的一种新的函数类型,它允许我们创建暂停和恢复执行的函数。这种特性使得它们非常适合处理异步操作,因为可以在执行过程中暂停,等待某些操作完成后再继续。Generator函数的两个关键特征是星号标记和yield表达式。 首先,让我们了解Generator函数的基本结构。例如,以下是一个简单的Generator函数示例: ```javascript function* fn() { console.log('hello'); return 'Joh'; } ``` 执行`fn()`并不会立即执行函数体内的`console.log`和`return`,而是返回一个iterator对象。我们可以使用`let it = fn();`来获取这个迭代器,并通过`it.next()`来启动函数的执行。首次调用`next()`会打印出'hello',并返回一个对象,其`value`属性为'Joh',`done`属性为`true`,表示函数已经执行完毕。 Generator函数中的yield表达式是其核心,它可以暂停函数的执行,并将控制权交还给调用者。在yield后面可以跟随一个值,当通过`next()`传递给迭代器时,这个值会被传递回Generator函数体内。例如: ```javascript function* fn() { let name = yield 'Your Name?'; return name; } let it = fn(); console.log(it.next()); // {value: 'Your Name?', done: false} console.log(it.next('Tom')); // {value: 'Tom', done: true} ``` 在这个例子中,第一次调用`next()`会返回`'Your Name?'`作为value,而第二次调用时,'Tom'作为参数传递给`next()`,它会作为yield表达式的结果,赋值给变量`name`。 除了作为暂停和恢复执行的标志,yield还可以用于从外部向Generator函数传递数据。在Generator函数内部,yield表达式可以接收上一次调用`next()`传递的值,这使得它们在处理异步操作时非常灵活。例如,可以结合Promise来处理异步任务: ```javascript function* asyncTask() { let result = yield fetch('https://api.example.com/data'); console.log(result); } let task = asyncTask(); let nextStep = task.next(); fetch('https://api.example.com/data') .then(response => nextStep.value) .then(data => task.next(data)); ``` 在上面的例子中,Generator函数`asyncTask`通过yield语句等待Promise的解决,然后通过nextStep.value接收Promise的解决值,并继续执行Generator函数。 Generator函数提供了一种优雅的方式来处理异步操作,通过yield表达式控制流,同时允许在执行过程中传递数据。它们是ES6中的一项强大特性,极大地简化了复杂的异步代码,使得代码更易于理解和维护。

相关推荐

filetype

7.1.10、迭代器遍历器(Iterator)就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作。ES6 创造了一种新的遍历命令 for…of 循环,Iterator 接口主要供 for…of 消费,原生具备 iterator 接口的数据:ArrayArgumentsSetMapStringTypedArrayNodeList注意:需要自定义遍历数据的时候,要想到迭代器工作原理:创建一个指针对象,指向当前数据结构的起始位置第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员每调用 next 方法返回一个包含 value 和 done 属性的对象案例演示:遍历数组//声明一个数组const xiyou = ["唐僧", "孙悟空", "猪八戒", "沙僧"];//使用 for...of 遍历数组for (let v of xiyou) { console.log(v);}console.log("===============");//获取迭代器对象let iterator = xiyou[Symbol.iterator]();//调用对象的next方法console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());12345678910111213141516案例演示:自定义遍历数据//声明一个对象const banji = { name: "五班", stus: [ "张三", "李四", "王五", "小六" ], [Symbol.iterator]() { //索引变量 let index = 0; let _this = this; return { next: function () { if (index < _this.stus.length) { const result = {value: _this.stus[index], done: false}; //下标自增 index++; //返回结果 return result; } else { return {value: undefined, done: true}; } } }; }}//遍历这个对象for (let v of banji) { console.log(v);}1234567891011121314151617181920212223242526272829303132337.1.11、生成器生成器函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。7.1.11.1、生成器函数使用代码说明:* 的位置没有限制生成器函数返回的结果是迭代器对象,调用迭代器对象的 next 方法可以得到 yield 语句后的值yield 相当于函数的暂停标记,也可以认为是函数的分隔符,每调用一次 next 方法,执行一段代码next 方法可以传递实参,作为 yield 语句的返回值function * gen() { /*代码1开始执行*/ console.log("代码1执行了"); yield "一只没有耳朵"; /*代码2开始执行*/ console.log("代码2执行了"); yield "一只没有尾巴"; /*代码3开始执行*/ console.log("代码3执行了"); return "真奇怪";}let iterator = gen();console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());console.log("===============");//遍历for (let v of gen()) { console.log(v);}123456789101112131415161718192021227.1.11.2、生成器函数参数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());//next方法可以传入实参console.log(iterator.next('BBB'));console.log(iterator.next('CCC'));console.log(iterator.next('DDD'));1234567891011121314151617187.1.11.3、生成器函数实例案例演示:1s后控制台输出 111,2s后输出 222,3s后输出 333function 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();123456789101112131415161718192021222324252627282930案例演示:模拟获取 ,用户数据 ,订单数据 ,商品数据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(); console.log(users); let orders = yield getOrders(); console.log(orders); let goods = yield getGoods(); console.log(goods);}//调用生成器函数let iterator = gen();iterator.next();123456789101112131415161718192021222324252627282930313233

weixin_38658564
  • 粉丝: 2
上传资源 快速赚钱