当前位置:首页 > JavaScript

js 实现generator

2026-04-06 19:25:04JavaScript

实现 Generator 函数

在 JavaScript 中,Generator 是一种特殊的函数,可以通过 function* 语法定义。Generator 函数可以暂停和恢复执行,通过 yield 关键字实现。

基本语法

定义一个 Generator 函数需要使用 function* 语法,并在函数体内使用 yield 关键字来暂停执行并返回一个值。

function* myGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

调用 Generator 函数不会立即执行函数体,而是返回一个迭代器对象。通过调用迭代器的 next() 方法来逐步执行函数。

const gen = myGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }

传递参数

可以通过 yield 接收外部传入的值。调用 next() 方法时传入的参数会成为上一个 yield 表达式的返回值。

js 实现generator

function* generatorWithParam() {
  const a = yield 1;
  const b = yield a + 2;
  yield b + 3;
}

const gen = generatorWithParam();
console.log(gen.next());    // { value: 1, done: false }
console.log(gen.next(10));  // { value: 12, done: false }
console.log(gen.next(20));  // { value: 23, done: false }
console.log(gen.next());    // { value: undefined, done: true }

提前终止 Generator

可以通过调用 return() 方法提前终止 Generator 函数的执行。

function* infiniteGenerator() {
  let i = 0;
  while (true) {
    yield i++;
  }
}

const gen = infiniteGenerator();
console.log(gen.next()); // { value: 0, done: false }
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.return(10)); // { value: 10, done: true }
console.log(gen.next()); // { value: undefined, done: true }

错误处理

可以通过 throw() 方法在 Generator 函数内部抛出错误。

js 实现generator

function* errorGenerator() {
  try {
    yield 1;
    yield 2;
  } catch (e) {
    console.log('Caught error:', e);
  }
}

const gen = errorGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.throw('Something went wrong')); // Caught error: Something went wrong
console.log(gen.next()); // { value: undefined, done: true }

使用场景

Generator 函数常用于异步编程、惰性求值和生成无限序列等场景。

异步编程示例:

function* fetchUser() {
  const user = yield fetch('https://api.example.com/user');
  const posts = yield fetch('https://api.example.com/posts');
  return { user, posts };
}

无限序列示例:

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    [prev, curr] = [curr, prev + curr];
    yield curr;
  }
}

const fib = fibonacci();
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2
console.log(fib.next().value); // 3
console.log(fib.next().value); // 5

总结

Generator 函数通过 function* 定义,使用 yield 暂停执行并返回值。调用 Generator 函数返回一个迭代器,通过 next() 方法逐步执行。Generator 适用于异步编程、惰性求值和生成无限序列等场景。

标签: jsgenerator
分享给朋友:

相关文章

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…