ES6Generator函数next()参数

114 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天juejin.cn/post/712312…

Generator函数

  • yield本身是没有返回值的,或总是undefined,
  • next方法,先执行let创建变量
  • 再执行yield表达式后面的表达式
  • 遇到yield就暂停了。
  1. 再次调用next方法,next方法的参数会作为上一个yield的返回值。
  2. 即第二个next方法的参数是第一个yield表达式的返回值
  3. 第三个是第二个yield表达式的值

for...of循环可以自动遍历Generator函数运行时生成的Iterator对象,且此时不再需要调用next方法。

注意:循环的时候,不会输出return后面表达式的值。一旦next方法的返回对象的done属性为truefor...of循环就会中止,且不包含该返回对象,

Generator.prototype.throw()

  1. 是抛出异常的try{}catch(){}不会报错,不会影响程序正常运行,程序不会停下来,可能会输出一个错误的程序
  2. throw方法抛出的错误要被内部捕获,前提是必须至少执行过一次next方法。
  3. throw方法被捕获以后,会附带执行下一条yield表达式。也就是说,会附带执行一次next方法。
  4. Generator 函数体外抛出的错误,可以在函数体内捕获;反过来,Generator 函数体内抛出的错误,也可以被函数体外的catch捕获。
function* foo() {

Generator.prototype.return()

可以返回给定的值,并且终结遍历 Generator 函数。就相当于把指针指向了末尾

next()、throw()、return() 的共同点

它们的作用都是让 Generator 函数恢复执行,并且使用不同的语句替换yield表达式。

  1. next()是将yield表达式替换成一个值。
  2. throw()是将yield表达式替换成一个throw语句。
  3. return()是将yield表达式替换成一个return语句。

调用next就相当于读取yield后面的状态,把结果读出来

协程简单来说指的就是事件轮询,先执行,再得到结果,等有了结果,再回头处理

Generator应用

  1. 异步操作的同步化表达
  2. 控制流管理。控制流:一个程序按照顺序去执行,前一步执行完以后,才能继续执行。

主要用来封装层层递进的异步操作的,用来封装处理异步的结果的,不是来封装异步本身的。他也不是各异步函数

练习一个generator封装异步 封装好一个异步

generator函数和promise结合的话,肯定需要执行器来传上一次promise的状态的异步结果

Generator 函数可以暂停执行和恢复执行,这是它能封装异步任务的根本原因。除此之外,它还有两个特性,使它可以作为异步编程的完整解决方案:函数体内外的数据交换和错误处理机制。

next返回值的 value 属性,是 Generator 函数向外输出数据;next方法还可以接受参数,向 Generator 函数体内输入数据。

下图是手动执行生成器函数

微信图片_20221008100555.png

下图是自动执行生成器函数

微信图片_20221008100907.png

下图是拉平数组的原理

微信图片_20221008100551.png