当前位置:首页 > JavaScript

js 实现generator

2026-02-02 02:15:41JavaScript

Generator 实现基础

Generator 是 ES6 引入的一种特殊函数,通过 function* 语法定义,内部使用 yield 关键字暂停执行并返回中间值。Generator 函数调用时返回一个迭代器对象,通过调用 next() 方法逐步执行。

function* simpleGenerator() {
  yield 1;
  yield 2;
  return 3;
}

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

生成无限序列

Generator 可以用于生成无限序列,例如斐波那契数列。由于惰性求值特性,只有在调用 next() 时才会计算下一个值。

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

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

异步流程控制

Generator 结合 Promise 可以实现类似 async/await 的异步流程控制。通过 yield 暂停执行,等待 Promise 解析后再继续。

js 实现generator

function* asyncTask() {
  const result1 = yield fetch('https://api.example.com/data1');
  const result2 = yield fetch('https://api.example.com/data2');
  return [result1, result2];
}

function runGenerator(gen) {
  const iterator = gen();
  function handle(result) {
    if (result.done) return result.value;
    return Promise.resolve(result.value).then(res => {
      return handle(iterator.next(res));
    });
  }
  return handle(iterator.next());
}

runGenerator(asyncTask).then(results => console.log(results));

错误处理

Generator 内部可以通过 try/catch 捕获错误,外部也可以通过 iterator.throw() 方法抛出错误。

function* errorHandling() {
  try {
    yield 1;
    throw new Error('Generator error');
  } catch (e) {
    console.log('Caught inside:', e.message);
  }
}

const gen = errorHandling();
gen.next(); // { value: 1, done: false }
gen.throw(new Error('External error')); // Caught inside: External error

与迭代器协议结合

Generator 对象天然实现了迭代器协议,可以直接用于 for...of 循环或解构赋值。

js 实现generator

function* range(start, end) {
  for (let i = start; i <= end; i++) {
    yield i;
  }
}

for (const num of range(1, 5)) {
  console.log(num); // 1, 2, 3, 4, 5
}

const [a, b] = range(1, 2);
console.log(a, b); // 1 2

yield* 委托

yield* 表达式用于委托给另一个 Generator 或可迭代对象,简化嵌套 Generator 的调用。

function* generatorA() {
  yield 'a';
  yield 'b';
}

function* generatorB() {
  yield* generatorA();
  yield 'c';
}

console.log([...generatorB()]); // ['a', 'b', 'c']

状态机应用

Generator 可以用于实现状态机,通过 yield 暂停在不同状态,通过 next() 触发状态转换。

function* trafficLight() {
  while (true) {
    yield 'red';
    yield 'yellow';
    yield 'green';
  }
}

const light = trafficLight();
console.log(light.next().value); // 'red'
console.log(light.next().value); // 'yellow'
console.log(light.next().value); // 'green'

标签: jsgenerator
分享给朋友:

相关文章

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现滑动

js实现滑动

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