Generator 函数的执行流程是怎样的?

简介: 【10月更文挑战第30天】Generator函数的执行流程通过 `next()` 方法的调用实现暂停和恢复执行,结合 `yield` 关键字以及参数传递和错误处理机制,提供了一种灵活而强大的编程模式,可用于处理异步操作、数据生成与迭代等多种复杂的编程任务。

Generator函数的执行流程具有独特的暂停和恢复特性:

函数定义与初始化

  • 首先,使用 function* 语法定义一个Generator函数。在函数内部,可以包含普通的JavaScript语句以及 yield 关键字。
function* myGenerator() {
   
  console.log('开始执行Generator函数');
  yield '第一次暂停,返回值为Hello';
  console.log('继续执行');
  yield '第二次暂停,返回值为World';
  console.log('执行结束');
}

创建Generator对象

  • 当调用Generator函数时,并不会立即执行函数体中的代码,而是返回一个Generator对象。这个对象包含了一个 next() 方法,用于控制Generator函数的执行流程。
const gen = myGenerator();

首次执行与暂停

  • 第一次调用 gen.next() 方法时,Generator函数开始执行,从函数体的开头一直执行到遇到第一个 yield 关键字。此时,函数的执行会暂停,并将 yield 后面的值作为 next() 方法返回的对象中的 value 属性值返回,同时 done 属性值为 false,表示Generator函数尚未执行完毕。
const result1 = gen.next();
console.log(result1.value); 
console.log(result1.done);

在上述示例中,第一次调用 gen.next() 后,控制台会输出 开始执行Generator函数第一次暂停,返回值为Hello,并且 result1.done 的值为 false

恢复执行与再次暂停

  • 再次调用 gen.next() 方法时,函数会从上次暂停的位置继续执行,即从第一个 yield 语句之后的代码开始执行,直到遇到下一个 yield 语句或函数执行完毕。同样,在遇到 yield 语句时,函数会再次暂停,并返回相应的 valuedone 属性值。
const result2 = gen.next();
console.log(result2.value); 
console.log(result2.done);

此时,控制台会输出 继续执行第二次暂停,返回值为Worldresult2.done 的值依然为 false

执行结束

  • 当Generator函数执行到最后,如果没有遇到新的 yield 语句,再次调用 gen.next() 方法时,函数会执行完毕,并返回一个 done 属性为 true 的对象,此时 value 属性的值可以是函数的返回值,如果没有显式的返回值,则为 undefined
const result3 = gen.next();
console.log(result3.value); 
console.log(result3.done);

最后一次调用 gen.next() 后,控制台会输出 执行结束true,表示Generator函数已经执行结束。

传递参数

  • 可以在调用 next() 方法时传递参数,这个参数会作为上一次 yield 表达式的返回值。这使得Generator函数在暂停和恢复执行的过程中能够进行数据的传递和交互。
function* parameterizedGenerator() {
   
  const value1 = yield '等待传入参数';
  console.log('接收到的参数为:', value1);
  const value2 = yield '再次等待传入参数';
  console.log('接收到的参数为:', value2);
}

const gen2 = parameterizedGenerator();
const result4 = gen2.next();
console.log(result4.value);
const result5 = gen2.next('第一个参数');
console.log(result5.value);
const result6 = gen2.next('第二个参数');

在这个示例中,通过在 next() 方法中传递参数,实现了与Generator函数内部的交互,使得函数能够根据传入的参数进行不同的处理。

错误处理

  • Generator函数内部可以使用 try...catch 语句来捕获错误。当Generator函数执行过程中抛出错误时,可以在 try...catch 块中进行捕获和处理,避免错误向上传播导致程序崩溃。
function* errorGenerator() {
   
  try {
   
    yield '正常执行步骤';
    throw new Error('模拟发生错误');
  } catch (error) {
   
    console.log('捕获到错误:', error);
  }
}

const gen3 = errorGenerator();
console.log(gen3.next().value);
console.log(gen3.next().value);

在上述示例中,当Generator函数执行到 throw 语句时,会抛出错误,然后被 try...catch 块捕获并进行相应的处理。

综上所述,Generator函数的执行流程通过 next() 方法的调用实现暂停和恢复执行,结合 yield 关键字以及参数传递和错误处理机制,提供了一种灵活而强大的编程模式,可用于处理异步操作、数据生成与迭代等多种复杂的编程任务。

相关文章
|
2天前
|
存储 JavaScript 前端开发
Generator 函数的使用场景有哪些?
【10月更文挑战第30天】Generator函数在JavaScript中提供了一种强大而灵活的编程模式,能够在异步编程、数据处理、状态管理等多个领域发挥重要作用,帮助开发者更高效地解决各种复杂的编程问题,提高代码的可读性和可维护性。
|
25天前
|
Python
Generator 函数
Generator 函数是 ES6 引入的一种异步编程解决方案,它允许函数执行过程中暂停并保存当前状态,待需要时再恢复执行。通过 `function*` 定义,使用 `yield` 关键字控制暂停点。
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
生成器(Generator)
生成器(Generator)
|
6月前
|
JavaScript 容器
generator 和 yield的使用
generator 和 yield的使用
42 0
|
11月前
|
JavaScript
Generator函数自动执行器
Generator函数自动执行器
49 0
|
Python
pytest学习和使用7-fixture参数scope作用域(范围)执行顺序
pytest学习和使用7-fixture参数scope作用域(范围)执行顺序
74 0
|
测试技术
pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)
pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)
101 0
简单手写async函数,让生成器函数自动执行
简单手写async函数,让生成器函数自动执行
199 0
|
程序员 索引 Python
【Python基础之函数:异常相关和生成器对象、yield用法、生成器表达式】
【Python基础之函数:异常相关和生成器对象、yield用法、生成器表达式】
107 0
|
测试技术 API
【pytest】使用parametrize将参数化变量传递到fixture
【pytest】使用parametrize将参数化变量传递到fixture