当前位置:首页 > JavaScript

js yield 实现

2026-04-06 02:15:56JavaScript

Yield 实现原理

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

js yield 实现

基本用法示例

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

js yield 实现

手动模拟生成器

可以通过闭包和状态管理模拟 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 的流程控制:

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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js树实现

js树实现

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

vue实现js休眠

vue实现js休眠

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