zoukankan      html  css  js  c++  java
  • ES6参考---Generator函数

    ES6参考---Generator函数

    一、总结

    一句话总结:

    Generator函数和promise一样,也是用来做异步的,也是状态机的方式实现异步,只不过是通过遍历器iterator加yield(暂停)实现的

    1、Generator函数的作用是什么?

    Generator函数和promise一样,也是用来做异步的,也是状态机的方式实现异步,只不过是通过遍历器iterator加yield(暂停)实现的

    2、怎么判断一个函数是不是Generator函数?

    Generator函数的 function与函数名之间有一个星号

    3、Generator函数 介绍?

    1、Generator函数是ES6提供的解决异步编程的方案之一
    2、Generator函数是一个状态机,内部封装了不同状态的数据,
    3、Generator函数用来生成遍历器对象
    4、Generator函数是可暂停函数(惰性求值), yield可暂停,next方法可启动。每次返回的是yield后的表达式结果

    4、Generator函数 特点?

    a、Generator内部用yield表达式来定义不同的状态
    b、调用next方法函数内部逻辑开始执行,遇到yield表达式停止,返回{value: yield后的表达式结果/undefined, done: false/true}
    c、再次调用next方法会从上一次停止时的yield处开始,直到最后
    d、yield语句返回结果通常为undefined, 当调用next方法时传参内容会作为启动时yield语句的返回值。

    5、Generator函数 ajax异步实例?

    *、yield后接ajax:let url = yield getNews('http://localhost:3000/news?newsId=2');
    *、Generator函数对象执行next方法:sx.next();
        /*
        * 需求:
        * 1、发送ajax请求获取新闻内容
        * 2、新闻内容获取成功后再次发送请求,获取对应的新闻评论内容
        * 3、新闻内容获取失败则不需要再次发送请求。
        * 
        * */ 
        function* sendXml() {
          // url为next传参进来的数据
         let url = yield getNews('http://localhost:3000/news?newsId=2');
          yield getNews(url);
        }
        function getNews(url) {
          $.get(url, function (data) {
            console.log(data);
            let commentsUrl = data.commentsUrl;
            let url = 'http://localhost:3000' + commentsUrl;
            // 当获取新闻内容成功,发送请求获取对应的评论内容
            // 调用next传参会作为上次暂停是yield的返回值
            sx.next(url);
          })
        }
    
    
        let sx = sendXml();
        // 发送请求获取新闻内容
        sx.next();

    二、Generator函数

    博客对应课程的视频位置:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4   <meta charset="UTF-8">
     5   <title>Generator函数</title>
     6 </head>
     7 <body>
     8 
     9   <!--
    10    Generator函数
    11     概念:
    12       1、ES6提供的解决异步编程的方案之一
    13       2、Generator函数是一个状态机,内部封装了不同状态的数据,
    14       3、用来生成遍历器对象
    15       4、可暂停函数(惰性求值), yield可暂停,next方法可启动。每次返回的是yield后的表达式结果
    16     特点:
    17       1、function 与函数名之间有一个星号
    18       2、内部用yield表达式来定义不同的状态
    19       例如:
    20         function* generatorExample(){
    21           let result = yield 'hello';  // 状态值为hello
    22           yield 'generator'; // 状态值为generator
    23         }
    24       3、generator函数返回的是指针对象(接11章节里iterator),而不会执行函数内部逻辑
    25       4、调用next方法函数内部逻辑开始执行,遇到yield表达式停止,返回{value: yield后的表达式结果/undefined, done: false/true}
    26       5、再次调用next方法会从上一次停止时的yield处开始,直到最后
    27       6、yield语句返回结果通常为undefined, 当调用next方法时传参内容会作为启动时yield语句的返回值。
    28   -->
    29 <script type="text/javascript" src="./js/jquery-1.10.1.min.js"></script>
    30 <script type="text/javascript">
    31     // 小试牛刀
    32     function* generatorTest() {
    33       console.log('函数开始执行');
    34       yield 'hello';
    35       console.log('函数暂停后再次启动');
    36       yield 'generator';
    37     }
    38     // 生成遍历器对象
    39     let Gt = generatorTest();
    40     // 执行函数,遇到yield后即暂停
    41     console.log(Gt); // 遍历器对象
    42     let result = Gt.next(); // 函数执行,遇到yield暂停
    43     console.log(result); // {value: "hello", done: false}
    44     result = Gt.next(); // 函数再次启动
    45     console.log(result); // {value: 'generator', done: false}
    46     result = Gt.next();
    47     console.log(result); // {value: undefined, done: true}表示函数内部状态已经遍历完毕
    48 
    49     // 对象的Symbol.iterator属性;
    50     let myIterable = {};
    51     myIterable[Symbol.iterator] = function* () {
    52       yield 1;
    53       yield 2;
    54       yield 4;
    55     };
    56     for(let i of myIterable){
    57       console.log(i);
    58     }
    59     let obj = [...myIterable];
    60     console.log(obj);
    61 
    62     console.log('-------------------------------');
    63     // 案例练习
    64     /*
    65     * 需求:
    66     * 1、发送ajax请求获取新闻内容
    67     * 2、新闻内容获取成功后再次发送请求,获取对应的新闻评论内容
    68     * 3、新闻内容获取失败则不需要再次发送请求。
    69     * 
    70     * */ 
    71     function* sendXml() {
    72       // url为next传参进来的数据
    73      let url = yield getNews('http://localhost:3000/news?newsId=2');
    74       yield getNews(url);
    75     }
    76     function getNews(url) {
    77       $.get(url, function (data) {
    78         console.log(data);
    79         let commentsUrl = data.commentsUrl;
    80         let url = 'http://localhost:3000' + commentsUrl;
    81         // 当获取新闻内容成功,发送请求获取对应的评论内容
    82         // 调用next传参会作为上次暂停是yield的返回值
    83         sx.next(url);
    84       })
    85     }
    86 
    87 
    88     let sx = sendXml();
    89     // 发送请求获取新闻内容
    90     sx.next();
    91 
    92     
    93 
    94 </script>
    95 
    96 
    97 </body>
    98 </html>
     
  • 相关阅读:
    打开一个网页,以html代码保存于txt文件中
    用C查看系统任务管理器中运行的程序
    常见两种LINK错误
    怎么把下载的dll和def生成lib,以用于编程
    建立一个不能打开的文件(占坑)C语言高级API调用
    [转]软件版本命名格式
    回调函数编写和注重点
    ubuntu linux mysql 开发模式与连接编译
    创建一个进程和两个管道,实现与进程通信
    hdoj 1115 Lifting the Stone (求多边形重心)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12587182.html
Copyright © 2011-2022 走看看