ES6 之 generator 函数

本文深入探讨了ES6中Generator函数的概念与应用,包括其如何解决异步编程中深度嵌套的问题,以及如何通过yield表达式实现函数的分段执行。文章还提供了Generator函数与axios结合请求数据的实例。

Generator 函数是 ES6 提供的一种异步编程解决方案。(解决异步,深度嵌套的问题)语法行为与传统函数完全不同。
·
·
异步:不连续,上一个操作没有执行完 下一个操作照样开始
同步:连续执行,上一个操作没有执行完 下一个没法开始

generator函数语法

function * show() {
      yield 'welcome'
      yield 'to'
      return 'myBlog'
    }  
  • function关键字和函数名称之间有 *连接
  • 函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。

调用

let g1 = show()

console.log(g1.next()) // {value: "welcome", done: false}
console.log(g1.next()) // {value: "to", done: false}
console.log(g1.next()) // {value: "myBlog", done: true}
  • Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象
  • 必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止。换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行。
  • next方法返回一个对象,它的value属性就是当前yield表达式的值hello,done属性的值false,表示遍历还没有结束,值为true表示遍历结束。

上述调用,手动调用,麻烦。还可以使用下面方法:

  1. 可以使用for…of…自动遍历generator
function* show() {
      yield 'welcome'
      yield 'to'
      return 'myBlog'
    }

    let g1 = show()

    for (let val of g1) {
      console.log(val)
    }
    // welcome to (return的东西,它不会遍历)
    
  1. 结合结构赋值
function* show() {
      yield 'welcome'
      yield 'to'
      return 'myBlog'
    }


    let [a, b, c] = show()
    console.log(a, b, c) // welcome to undefined
  1. 使用扩展运算符
function* show() {
      yield 'welcome'
      yield 'to'
      return 'myBlog'
    }


    console.log(...show()) // welcome to 
  1. Array.from()
function* show() {
      yield 'welcome'
      yield 'to'
      return 'myBlog'
    }


    console.log(Array.from(show())) // ["welcome", "to"]
应用:generator函数结合axios请求数据
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <script>

    // 请求接口:https://api.githup.com/users/itstrive

    function * gen() {
      let val = yield 'itstrive'
      yield axios.get(`https://api.githup.com/users/${val}`)
    }

    let g1 = gen()

    let userName = g1.next().value

    // console.log(g1.next(userName).value)

    g1.next(userName).value.then(res => {
      console.log(res.data)
    })
    
  </script>

前端进阶精选:点此去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值