446 generator

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Generator函数</title>
</head>

<body>

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

    特点:
      1、function 与 函数名 之间有一个星号

      2、内部用yield表达式来定义不同的状态
      例如:
        function* generatorExample(){
          let result = yield ‘hello‘;  // 状态值为hello
          yield ‘generator‘; // 状态值为generator
        }

      3、generator函数返回的是指针对象(接11章节里iterator),而不会执行函数内部逻辑

      4、调用next方法,函数内部逻辑开始执行,遇到yield表达式停止,返回 {value: yield后的表达式结果/undefined, done: false/true}

      5、再次调用next方法会从上一次停止时的yield处开始,直到最后

      6、yield语句返回结果通常为undefined, 当调用next方法时,传参内容会作为启动时yield语句的返回值。
  -->

    <script type="text/javascript" src="./js/jquery-1.10.1.min.js"></script>
    <script type="text/javascript">
        // 小试牛刀
        function* generatorTest() {
            console.log(‘函数开始执行‘);
            yield ‘hello‘;
            console.log(‘函数暂停后再次启动‘);
            yield ‘generator‘;
            console.log(‘结束‘)
        }

        // 生成遍历器对象 【generatorTest是生成器函数,Gt是生成器对象】
        let Gt = generatorTest();
        console.log(Gt); // 遍历器对象 generatorTest?

        let result = Gt.next(); // 函数执行, 遇到yield暂停
        console.log(result); // {value: "hello", done: false}

        result = Gt.next(); // 函数再次启动
        console.log(result); // {value: ‘generator‘, done: false}

        result = Gt.next();
        console.log(result); // {value: undefined, done: true} 表示函数内部状态已经遍历完毕

        // 对象的Symbol.iterator属性, 指向该对象的默认遍历器方法 【原本对象是不能用for of遍历的。】
        let myIterable = {};
        myIterable[Symbol.iterator] = function* () {
            yield 1;
            yield 2;
            yield 4;
        };

        for (let i of myIterable) {
            console.log(i); // ?1 2 4
        }

        let obj = [...myIterable];
        console.log(obj); // ?[1, 2, 4]

        console.log(‘-------------------------------‘);

        // 案例练习
        /*
        * 需求:
        * 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();
    </script>
</body>

</html>

原文地址:https://www.cnblogs.com/jianjie/p/12700418.html

时间: 2024-10-13 11:22:15

446 generator的相关文章

使用MyBatis Generator自动生成实体、mapper和dao层

通过MyBatis Generator可以自动生成实体.mapper和dao层,记录一下怎么用的. 主要步骤: 关于mybatis从数据库反向生成实体.DAO.mapper: 参考文章:http://www.cnblogs.com/wangkeai/p/6934683.html第一种方式:main方法运行(推荐) 1.在pom.xml中加入插件依赖: 2.写mbgConfiguration.xml文件,jdbc.properties文件 3.写/SSM/src/main/java/main/Ge

babel转码时generator的regeneratorRuntime

今天写generator函数时发现出错:regeneratorRuntime. 在stackoverflow网友说需是本地babel软件包没有安装完全. package.json: "devDependencies": { "babel-core": "^6.0.20", "babel-polyfill": "^6.0.16", "babel-preset-es2015": "

async(await)函数和 Generator 函数 区别

async 函数是 Generator 函数的语法糖. async 函数对 Generator 函数的改进体现在: 1. async 内置执行器. Generator 函数的执行必须靠执行器,需要调用 next() 方法,或者用co 模块:而 async 函数自带执行器.也就是说,async 函数的执行与普通函数一模一样,只要一行. 2. 更好的语义. async 和 await 比起星号和 yield,语义更清楚. 3.更广的适用性. co 模块约定,yield 命令后面只能是 Thunk 函

MyEclipse下安装MyBatis Generator代码反向生成工具

一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 features/ plugins/ 里面所有的jar包,新建一个mybatis-generator文件夹,把features跟plugins都丢到mybatis-generator文件夹中,把mybatis-generator文件夹移到D:\MyEclipse10_7\MyEclipse 10\dropins

Entity Framework工具POCO Code First Generator的使用

在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一款不错的工具 在Visual Studio中,通过"工具"→"扩展和更新..."来安装Entity Framework Reverse POCO Code First Generator 这里添加一个控制台项目,并在项目中添加POCO Code First Genera

Mybatis入门实例(三)——使用MyBatis Generator生成DAO(转载http://qiuqiu0034.iteye.com/blog/1163026)

接上回 http://qiuqiu0034.iteye.com/blog/1162952 虽然MyBatis很方便,但是想要手写全部的mapper还是很累人的,好在MyBatis官方推出了自动化工具,可以根据数据库和定义好的配置直接生成DAO层及以下的全部代码,非常方便. 需要注意的是,虽然自动化工具需要一个配置文件,但是MyBatis的配置文件仍然不能少,自动化工具的配置文件用于对生成的代码的选项进行配置,MyBatis的配置文件才是运行时的主要配置文件. 这个工具叫做MyBatis_Gene

ES6生成器函数generator

generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 yield语句前面暂停,之后通过调用返回的迭代器next()方法来执行yield语句.如下代码演示: function* generator() { yield 1; yield 2; yield 3; } var gen = generator(); 如上代码:generator函数的调用方法与普通函数一样,也是在函数名后面加上一对圆

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法

mybatis generator工具的使用

mybatis反转数据库的配置文件: generatorConfig.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybati