异步编程(Asynchronous) - 11 Promise - Generator生成器

为什么需要生成器函数

  • Promise通过链式调用解决了回调过深的问题
  • 但是, 即使如此,仍然会有大量的回调函数
  • 如何让异步像同步一样写法

Generator

function* foo(){
  console.info('start')
  try{
    const res = yield 'foo'
    console.info('res',res)
    yield res
  }catch(e){
    console.info(e)
  }
}

// Step_0 :调用这个函数并不会立即执行这个函数,而是会得到一个[[生成器对象]]
const generator = foo()

// Step_1: 需要手动调用这个[[生成器对象]]的next方法才会执行函数的逻辑, 执行到yield的时候,返回yield后面的值,然后函数暂停
const result = generator.next()
console.info('result:', result) // {value: "foo", done: false} 有个done属性表示是否这个函数执行完了

// Step_2: 从刚才暂停的地方继续执行, 
const result2 = generator.next('bar') // next方法可以接收参数, 那么这个yield可以接收这个参数,会作为下一个yield的返回值 ⏫⏫⏫
console.info('result2:', result2) // {value: "bar", done: false}

// Step_3: 从刚才暂停的地方继续执行, 
console.info(generator.next()) // {value: undefined, done: true}
generator.throw(new Error('Generator error')) // 对生成器手动抛出一个异常, 生成器内部就会得到这个异常

posted @ 2020-08-19 20:54  荣光无限  阅读(94)  评论(0)    收藏  举报