zoukankan      html  css  js  c++  java
  • 生成函数

    1、定义

    function * 函数名{
      let obj = yield "生成器函数" 
    }

    与普通函数的区别:

      1、function后面加了*

      2、函数体里有 yield关键字

    2、表现

      1、调用这个函数,不会立即执行函数体里的内容,返回一个对象

      2、通过这个对象的next方法,可以驱动函数的执行,但是并不会执行完,执行到下一个yield关键字的时候,停住

      3、调用next()方法返回的结果

      • value: yield关键字后面的表达式的内容。
      • done:函数是否执行完,执行完返回true,未执行完返回false。 (当生成函数return的执行完,函数执行结束,返回true)
      • 函数return的时候,value是return语句的内容,done是true

      4、next()方法可以加参数

      • next(参数)
      • 这个参数会作为上一个yield关键字的返回值

    3、作用

      1、生成函数可以返回多个值

      2、在调用函数之后,可以给函数体里传递数据

      3、调用函数的时候,可以控制函数内部的执行

      4、可以解决异步问题

    4、生成函数执行器

    // 写一个生成函数的执行器
            function run(gen) {
                // 编写一段递归调用来执行我们的代码
                let lt = gen();
                debugger
                return new Promise((reslove, reject) => {
                    // {value,done}
                    function step(data) {
                        if (data.done) {
                            console.log("递归调用结束了");
                            reslove(data.value)
                        } else {
                            data.value.then(res => {
                                step(lt.next(res))
                            })
                        }
                    }
    
                    step(lt.next())
                })
            }

    5、yield

      yield在生成函数中起到了十分重要的作用,就相当于暂停执行并且返回信息。return代表的是终止执行,yield代表的是暂停执行,后续通过调用生成器的next()方法,可以恢复执行。

      在一个Generator函数里面,如果我们想调用另一个Generator函数,就需要用到的关键字是:yield*。

    function* gen1(){
        yield "gen1 start";
        yield "gen1 end";
     
    }
     
    function* start(){
        yield "start";
        yield* gen1();
        yield "end";
    }
     
    var ite1 = start();
    console.log(ite1.next());//start
    console.log(ite1.next());//gen1 start
     
    console.log(ite1.next());//gen1 end
    console.log(ite1.next());//end
    console.log(ite1.next());//undefined
  • 相关阅读:
    Codeforces Round #384 (Div. 2)
    Codeforces Round #383 (Div. 2)
    bzoj-4514(网络流)
    bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
    bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
    hdu-5988 Coding Contest(费用流)
    hdu-5992 Finding Hotels(kd-tree)
    用链表实现杭电1276士兵队列训练问题
    循环链表
    图书管理系统
  • 原文地址:https://www.cnblogs.com/wangxue13/p/13610637.html
Copyright © 2011-2022 走看看