JavaScript的generator


prtyaa
prtyaa 2023-12-26 18:29:06 63590
分类专栏: 资讯

1、generator 是可以用来控制迭代器的函数,它主要的方法有以下三个:

  • generator.prototype.next() 返回一个由 yield 表达式生成的值
  • generator.prototype.return() 返回给定的值,并结束生成器
  • generator.prototype.throw() 向生成器抛出一个错误

2、基本使用

常规的遍历,会一次性遍历输出所有的值,但是使用了 generator 生成器,我们可以使用 next()函数,得到每次遍历的结果,使得遍历变得可控制。如下代码,第一次通过 l.next() 得到 1,第二次得到2,第三次 for 循环遍历结束,便不再输出,返回 {value: undefined, done: true}

function * loop () {
  for (let i = 0; i < 2; i++) {
   yield console.log(i)
  }
}
const l = loop()
l.next() // 1 {value: undefined, done: false}
l.next() // 2 {value: undefined, done: false}
l.next() // {value: undefined, done: true}

3、yield

  • yield 表达式的返回值是 undefined,但是 next() 方法可以修改这个值
function * gen () {
  let val
  val = yield 1
  console.log(`1:${val}`) // 1:undefined
  val = yield 2
  console.log(`2:${val}`) // 2:undefined
  val = yield 3
  console.log(`3:${val}`) // 3:undefined
}

var g = gen()

console.log(g.next()) // {value: 1, done: false}
console.log(g.next()) // {value: 2, done: false}
console.log(g.next()) // {value: 3, done: false}
console.log(g.next()) // {value: undefined, done: true}

4、next

  • generator 通过 next() 获取每一次遍历的结果,这个方法返回一个对象,对象包含两个属性:value 和 done
  • value 指当前程序运行的结果,done 表示程序执行是否结束
  • next() 可以接受参数,这个参数作为 yeild 的返回值
function * gen () {
  var val = 100
  while (true) {
    val = yield val
  }
}

var g = gen()
console.log(g.next(20).value) // 100
console.log(g.next(30).value) // 30
console.log(g.next(40).value) // 40

5、return

  • generator 中的 return() 方法是用来终止遍历器的
  • return() 也可以传参数作为value的值
function * gen () {
  yield 1
  yield 2
  yield 3
}

var g = gen()

console.log(g.next()) // {value: 1, done: false}
console.log(g.return(100)) // {value: 100, done: true}
console.log(g.next()) // {value: undefined, done: true}

6、throw

  • generator 中的 throw() 方法控制程序执行的中断
function * gen () {
  while (true) {
    try {
      yield 1
    } catch (e) {
      console.log(e.message)
      return false
    }
  }
}

let g = gen()
console.log(g.next()) // { value: 1, done: false }
console.log(g.next()) // { value: 1, done: false }
console.log(g.next()) // { value: 1, done: false }
// 中断操作
g.throw(new Error('error'))
console.log(g.next()) // {value: undefined, done: true}

7、使用 generator 函数注意事项

    • 比普通函数多一个 *
    • 函数内部通过 yield 来控制程序执行的“暂停”
    • 函数的返回值通过调用 next() 来恢复程序执行
    • generator 的 next() 方法,遇到 yield 就暂停,并返回一个对象,这个对象包括两个属性值 value 和 done

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31012
赞同 0
评论 0 条