深度理解 ES12 中的 Generator:如何在异步编程中应用

深度理解 ES12 中的 Generator:如何在异步编程中应用

随着 JavaScript 不断发展,异步编程成为了一个必不可少的技能。在异步编程中,经常需要处理一系列需要等待的操作,这时候就需要运用 Generator 函数来进行控制。

一、什么是 Generator?

Generator 是 ES6 中的一个新特性,可以被看作是一个状态机,所有的 Generator 都支持 next、return 和 throw 这三个方法。在调用next()的时候,就会执行 Generator 函数,直到遇到 yield,进入暂停状态,返回 yield 后的值。Generator 函数调用 return 方法时,会结束并返回相应的值。throw 方法则是抛出错误。

例子:

function* foo(){
      yield 1;
      yield 2;
      yield 3;
      return 4;
}
let f = foo();
console.log(f.next());//  {value: 1, done: false}
console.log(f.next());//  {value: 2, done: false}
console.log(f.next());//  {value: 3, done: false}
console.log(f.next());//  {value: 4, done: true}

二、Generator 在异步编程中的应用

我们在异步编程中常常使用回调函数,但是随着业务代码越来越复杂,回调函数嵌套格式越来越深,导致代码可读性、可维护性变差。而 Generator 函数结合 Promise 对象可以解决这个问题。通过将异步操作写成 yield 函数,而不是直接使用回调函数,避免了回调函数嵌套。

例子:

function* test(){
  try{
    const b = yield new Promise((resolve, reject) => {
      setTimeout(() => {//延迟2秒执行异步操作
        resolve(20)
      },2000)
    })
    console.log(b)
  }catch (e) {
    console.log(e)
  }
}

let a = test()
let res1 = a.next()

res1.value.then((res)=>{
  a.next(res)
})

我们在该例中使用 setTimeout 模拟一个耗时 2 秒的异步操作,我们让Generator 函数等待这个异步操作,这样就避免了回调函数嵌套,提高了代码的可读性和可维护性。

三、Generator 可以多次暂停和恢复

因为 Generator 函数在 yield 前的状态会被保存下来,所以可以反复使用。

例子:

  function* gen(){
    console.log(1)
    yield;
    console.log(2)
    yield;
    console.log(3)
    yield;
    console.log(4)
  }
  const g = gen()
  g.next()// 1
  g.next()// 2
  g.next()// 3
  g.next()// 4

四、Generator 函数可以作为对象的属性

我们可以把一个 Generator 函数存储在一个对象上,并且在调用对象的方法时利用 yield 进行异步编程

例子:

const obj = {
  *gen(){
    const a = yield 1
    console.log(a)
    const b = yield 2
    console.log(b)
    const c = yield 3
    console.log(c)
  }
}
const objGen = obj.gen()
objGen.next()// 1 返回 {value:1, done: false}
objGen.next(11)//11  返回 {value: 2, done: false}
objGen.next(22)//22 返回 {value: 3, done: false}
objGen.next(33)//33 返回 {value: 'undefined', done: true}

在这个例子中,我们将 gen 方法作为对象 obj 的属性,然后调用 gen 方法中的 yield,控制函数执行先后顺序。

五、Generator 函数使用场景

1、异步编程时的流程控制 2、数据的惰性求值 3、处理无限循环中的异步操作 4、实现迭代协议

六、总结

在异步编程中,Generator 函数的应用可以使代码更加清晰易懂并避免回调函数嵌套,提高了代码的可读性和可维护性。同时,Generator 的多次暂停和恢复特性以及可以作为对象的属性,也拓宽了 Generator 可以应用的场景,非常具有指导意义。

希望这篇文章能给大家带来一些帮助和指导。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6590c89eeb4cecbf2d60cb7d


纠错反馈