当前位置:首页 > JavaScript

js yield 实现

2026-04-06 02:15:56JavaScript

Yield 实现原理

在 JavaScript 中,yield 是生成器函数(Generator Function)的关键字,用于暂停和恢复函数执行。生成器函数通过 function* 语法定义,调用时返回一个生成器对象(Generator Object),该对象遵循迭代器协议。

基本用法示例

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 }

实现机制

生成器函数通过 yield 暂停执行,保存当前上下文(包括局部变量、指令指针等)。每次调用 next() 方法时,生成器从上次暂停的位置恢复执行,直到遇到下一个 yieldreturn

手动模拟生成器

可以通过闭包和状态管理模拟 yield 的行为:

function mockGenerator() {
  let state = 0;
  return {
    next: function() {
      switch (state) {
        case 0:
          state++;
          return { value: 1, done: false };
        case 1:
          state++;
          return { value: 2, done: false };
        default:
          return { value: undefined, done: true };
      }
    }
  };
}

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

异步生成器

yield 可与异步操作结合,实现类似 async/await 的流程控制:

js yield 实现

function* asyncGenerator() {
  const result = yield new Promise(resolve => setTimeout(() => resolve('Done'), 1000));
  console.log(result);
}

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

runGenerator(asyncGenerator); // 输出 "Done"(1秒后)

注意事项

  • 生成器对象不可重用,完成迭代后再次调用 next() 始终返回 { done: true }
  • yield* 可用于委托给另一个生成器或可迭代对象。
  • 生成器函数可通过 throw() 方法在暂停位置抛出异常。

标签: jsyield
分享给朋友:

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…