生成函数

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

 

posted @ 2020-09-03 20:59  靡荼  阅读(147)  评论(0编辑  收藏  举报