您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

TypeScript 生成器(Generator)

迭代器和器这两个概念总是很容易混淆,经过上节的学习我们知道迭代器是对象,那么本节首先要记住:器是一种能够中途停止,然后从停止的地方继续运行的。可以借助 yieldreturn 停止运行。

通过 function* 来创建器,在器后,并不会立即执行中的,而是会返回迭代器对象,通过迭代器对象的 next() ,可以获得 yield/return 的返回值。

正常的,如果没有 return 或者 throw 异常,一旦被在运行结束之前是不会停止的。如果再次这个,它会再次从第一行开始执行。

In contrast, a generator is a function that can stop midway and then continue from where it stopped.

相反,器可以中途停止,然后从停止的地方继续执行的。

器会返回对象,可以这个对象上的 next()

function* generatorFunction() { 
  console.log('开始执行')
  yield 'Hello, '

  console.log('暂停后再次执行')
  yield 'World!'
}

let iterator = generatorFunction()

此时,通过 function* 语法创建了器,这个并赋值给变量 iterator,我们已经知道这是个对象。

console.log(iterator.next().value)
// 开始执行
// Hello, 

iterator 对象上的 next() ,首先打印出 开始执行,然后遇到了 yield Hello,yield 会将后面的值返回,器对象 { value: 'Hello, ', done: false },停止运行,直到再次 next()

console.log(iterator.next().value)
// 暂停后再次执行
// World!

再次 next() ,内继续执行,打印出 暂停后再次执行,遇到 yield 'World!',对象 { value: 'World!', done: false },停止运行,直到再次 next()

console.log(iterator.next())

再次 next() ,这次内没有返回值,也就是认返回 undefined, 对象 { value: 'undefined', done: true }

在 next() 的时候可以传递参数,在上次 yield 前接收到这个参数:

function* gen() { 
  console.log('开始执行')
  let res1 = yield 
  console.log('中断后继续执行')
  console.log(res1)
  
  let res2 = yield 
  console.log(res2)
  
  console.log('执行结束')
  return 
}

let iterator = gen()
console.log(iterator.next('first'))
console.log(iterator.next('second'))
console.log(iterator.next('third'))

执行并查看结果:

开始执行
{ value: 1, done: false }
中断后继续执行
second
{ value: 2, done: false }
third
执行结束
{ value: 3, done: true }

这里注意下,器最初没有产生任何结果,在第一次 next() 时传参是无意义的。

器还有另巨大的好处,就是把异步回调变成“同步”。async await 就是基于器的语法糖,await 可以等待异步执行完毕再继续执行后面的。


联系我
置顶