【ES6复习条记】生成器(11)

打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

什么是生成器函数

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


  • 界说生成器函数:使用 function* 关键字来界说生成器函数。
  • 使用 yield 关键字:在生成器函数中使用 yield 关键字来返回一个值,并暂停函数的执行。
  • 创建迭代器对象:通过调用生成器函数来创建一个迭代器对象。
  • 使用 next() 方法:使用迭代器对象的 next() 方法来规复生成器函数的执行,并获取下一个值。
生成器函数的实例

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>生成器</title>
  7. </head>
  8. <body>
  9.     <script>
  10.         // 生成器函数
  11.         function* gen() {
  12.             yield '一只没有耳朵';
  13.             yield '一只没有尾巴';
  14.             yield '真奇怪';
  15.         }
  16.         // 创建迭代器对象
  17.         let iterator = gen();
  18.         // 使用 next() 方法获取值
  19.         console.log(iterator.next()); // { value: '一只没有耳朵', done: false }
  20.         console.log(iterator.next()); // { value: '一只没有尾巴', done: false }
  21.         console.log(iterator.next()); // { value: '真奇怪', done: false }
  22.         console.log(iterator.next()); // { value: undefined, done: true }
  23.     </script>
  24. </body>
  25. </html>
复制代码
实例 2:使用生成器函数实现异步操纵

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>生成器函数实例</title>
  7. </head>
  8. <body>
  9.     <script>
  10.         // 模拟异步获取数据
  11.         function getUsers() {
  12.             setTimeout(() => {
  13.                 let data = '用户数据';
  14.                 iterator.next(data);
  15.             }, 1000);
  16.         }
  17.         function getOrders() {
  18.             setTimeout(() => {
  19.                 let data = '订单数据';
  20.                 iterator.next(data);
  21.             }, 1000);
  22.         }
  23.         function getGoods() {
  24.             setTimeout(() => {
  25.                 let data = '商品数据';
  26.                 iterator.next(data);
  27.             }, 1000);
  28.         }
  29.         // 生成器函数
  30.         function* gen() {
  31.             let users = yield getUsers();
  32.             let orders = yield getOrders();
  33.             let goods = yield getGoods();
  34.         }
  35.         // 创建迭代器对象并开始执行
  36.         let iterator = gen();
  37.         iterator.next();
  38.     </script>
  39. </body>
  40. </html>
复制代码
实例 3:使用生成器函数处理回调地狱

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>生成器函数实例</title>
  7. </head>
  8. <body>
  9.     <script>
  10.         // 异步函数
  11.         function one() {
  12.             setTimeout(() => {
  13.                 console.log(111);
  14.                 iterator.next();
  15.             }, 1000);
  16.         }
  17.         function two() {
  18.             setTimeout(() => {
  19.                 console.log(222);
  20.                 iterator.next();
  21.             }, 2000);
  22.         }
  23.         function three() {
  24.             setTimeout(() => {
  25.                 console.log(333);
  26.                 iterator.next();
  27.             }, 3000);
  28.         }
  29.         // 生成器函数
  30.         function* gen() {
  31.             yield one();
  32.             yield two();
  33.             yield three();
  34.         }
  35.         // 创建迭代器对象并开始执行
  36.         let iterator = gen();
  37.         iterator.next();
  38.     </script>
  39. </body>
  40. </html>
复制代码
生成器函数的参数传递

生成器函数可以担当参数,而且可以在 yield 表达式中使用这些参数。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>生成器函数参数</title>
  7. </head>
  8. <body>
  9.     <script>
  10.         function* gen(arg) {
  11.             console.log(arg);
  12.             let one = yield 111;
  13.             console.log(one);
  14.             let two = yield 222;
  15.             console.log(two);
  16.             let three = yield 333;
  17.             console.log(three);
  18.         }
  19.         // 执行生成器函数并传递参数
  20.         let iterator = gen('AAA');
  21.         console.log(iterator.next());
  22.         console.log(iterator.next('BBB'));//next中传入的BBB将作为yield 111的返回结果
  23.         console.log(iterator.next('CCC'));//next中传入的CCC将作为yield 222的返回结果
  24.         console.log(iterator.next('DDD'));//next中传入的DDD将作为yield 333的返回结果
  25.     </script>
  26. </body>
  27. </html>
复制代码
通过以上实例,你可以看到生成器函数在处理异步操纵和避免回调地狱方面的强大能力。盼望这些教程对你有所帮助!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表