ES6 generator生成器函数 async

generator生成器函数

  • 定义

    • function后面加了*
    • 函数体里有 yield关键字 在这里起到了十分重要的作用,就相当于暂停执行并且返回信息。有点像传统函数的return的作用,是暂停执行
    • Generator函数被调用后得到的生成器理解成一个遍历器iterator,用于遍历函数内部的状态。
function * 函数名{
let obj = yield "生成器函数"
} 

表现形式

  • 调用这个函数,不会立即执行函数体里的内容,返回一个对象
  • 通过这个对象的next方法,可以驱动函数的执行,但是并不会执行完,执行到下一个yield关键字的时候,停住
  • 调用next()方法返回的结果
    • value: yield关键字后面的表达式的结果。
    • done:函数是否执行完。 (当函数return的时候执行完,返回true)
    • 函数return的时候,value是return的内容,done是true
  • next()方法可以加参数
    • next(参数)
    • 这个参数会作为上一个yield关键字的返回值

作用

  • 函数可以返回多个值
  • 在调用函数之后,可以给函数体里传递数据了
  • 调用函数的时候,可以控制函数内部的执行了
  • 可以解决异步问题
 

生成器函数的执行器

//定义生成器函数
function* initData() {
        let category = yield getShopCategory();
        let goods = yield getGoods(category[0].id);
        let comment = yield getComment(goods[0].id);
        return comment;
    }
  // 书写生成器函数执行函数
    function run(gen) {
        let lt = gen();
        return new Promise((reslove, reject) => {
            function step(data) {
                if (data.done) {
                    console.log('递归调用结束了');
                    reslove(data.value);
                } else {
                    data.value.then(res => {
                        step(lt.next(res))
                    })
                }
            }
            step(lt.next())
        })
    }
    //调用执行
    run(initData).then(res => {
        console.log(res);
    })

  

async/await
这是ES7的语法,它是基于generator函数做的语法糖。
直接运行到结果
async function initData() {
        let category = await getShopCategory();
        let goods = await getGoods(category[0].id);
        let comment = await getComment(goods[0].id);
        return comment;
    }
    initData().then(res => {
        console.log(res)
    })  
posted @ 2020-09-04 11:30  帅气巴巴  阅读(179)  评论(0编辑  收藏  举报