generator 通过 yield 切分动画逻辑为单帧任务,由 requestanimationframe 驱动 next() 执行,实现可暂停、快进、重置的精确帧调度;其本身不处理异步或真实时间控制,需外层结合时间戳或 promise 协同。

Generator 本身不直接控制动画帧,它提供的是可暂停、可恢复的执行流程,配合 requestAnimationFrame 才能实现逐帧的精确逻辑调度。关键在于把每一帧的计算/渲染步骤“切片”,交由 Generator 按需产出,再由 rAF 驱动执行。
用 Generator 切分动画逻辑为单帧任务
把原本写在 rAF 回调里的长耗时或状态递进逻辑(比如缓动计算、路径遍历、多阶段渲染)拆成一个个 yield 步骤。每个 yield 表示一帧完成,返回当前帧应处理的数据(如进度、坐标、透明度等),便于外部决定是否继续。
- 避免在 Generator 内部调用
requestAnimationFrame,它只负责“生成帧数据”,不负责调度 - 函数体里用
for或while循环 +yield控制步进节奏,例如每帧推进 1% 进度 - 可接收初始参数(起始值、持续帧数、缓动函数),内部封装状态,无需外部维护中间变量
用 rAF 驱动 Generator 执行,保证帧率稳定
rAF 提供浏览器刷新节奏(通常 60fps),是唯一可靠的帧同步机制。Generator 的 next() 调用应放在 rAF 回调中,每次只执行一帧逻辑,再根据返回值判断是否终止。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 首次调用
gen.next()启动,之后每次 rAF 触发时再调用一次next() - 检查
done属性:为true时停止 rAF 循环;否则继续 - 可通过
value获取当前帧的输出(如{ x: 120, opacity: 0.7 }),直接用于 DOM 更新或 canvas 绘制
支持暂停、快进、重置等控制能力
因为 Generator 状态完全由迭代器对象持有,外部可随时保存/恢复执行点,这是 class 或纯函数难以自然实现的。
- 暂停:停止调用
next(),迭代器停留在当前 yield 处,状态(局部变量、闭包)全部保留 - 快进:循环多次调用
next()(注意别跳过关键帧),适合预演或调试 - 重置:重新调用 Generator 函数获取新迭代器,从头开始
- 可结合事件(如鼠标悬停、按键)触发对应操作,逻辑解耦清晰
注意异步与时间精度的边界
Generator 是同步迭代器,无法原生等待 rAF 或 setTimeout。若需基于真实时间(而非帧数)控制节奏(如“2 秒后淡出”),必须在外层结合时间戳计算。
- 在 rAF 回调中记录
performance.now(),与目标时间比对,决定是否 yield 下一帧 - 不要在 Generator 内写
await delay()—— 这会脱离 rAF 节奏,导致掉帧或卡顿 - 复杂定时需求(如交错动画、依赖加载)建议用
Promise链 + rAF 封装,而非强塞进 Generator
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










