ES6 引入了 Generator 函数,它是一种特殊类型的函数,通过使用 function* 语法来定义。Generator 函数可以在执行过程中暂停,并且可以多次从暂停的位置恢复执行。这种特性使得编写异步代码更加简洁和易读。

以下是 Generator 函数的基本语法:
function* myGenerator() {
  // 通过 yield 暂停执行,并返回一个值给调用方
  yield 1;
  yield 2;
  yield 3;
  return "Finished";
}

// 创建 Generator 对象
const generator = myGenerator();

// 通过调用 next() 方法执行 Generator 函数
console.log(generator.next()); // 输出: { value: 1, done: false }
console.log(generator.next()); // 输出: { value: 2, done: false }
console.log(generator.next()); // 输出: { value: 3, done: false }
console.log(generator.next()); // 输出: { value: "Finished", done: true }
console.log(generator.next()); // 输出: { value: undefined, done: true }

在上述示例中,myGenerator 是一个 Generator 函数,使用 yield 关键字来定义生成器的每一步。每次调用 generator.next() 方法都会执行 Generator 函数的下一步,并返回一个包含当前步骤结果的对象。

Generator 函数的执行是惰性的,只有在调用 next() 方法时才会执行到下一个 yield 或函数结束。当 Generator 函数执行到最后,done 属性为 true,并且再次调用 next() 不会再有新的值产生。

Generator 函数还可以通过 yield* 来委托给另一个 Generator 函数,实现更复杂的控制流程。
function* anotherGenerator() {
  yield 4;
  yield 5;
  yield 6;
}

function* combinedGenerator() {
  yield 1;
  yield 2;
  yield 3;
  yield* anotherGenerator(); // 委托给另一个 Generator 函数
  yield 7;
}

const combined = combinedGenerator();
console.log(combined.next()); // 输出: { value: 1, done: false }
// ...
console.log(combined.next()); // 输出: { value: 7, done: false }
console.log(combined.next()); // 输出: { value: undefined, done: true }

Generator 函数的引入使得异步编程更加方便,例如通过使用 yield 暂停异步操作,配合 async/await 使用,可以更清晰地表达异步流程。


转载请注明出处:http://www.zyzy.cn/article/detail/4678/ES6