generator 本身不直接支持异步暂停与取消,需结合 yield、return()、throw() 及外部调度器(如 promise 处理函数)实现;暂停靠 yield 交出控制权,恢复靠 next();取消靠 return()、throw() 或状态标记协同 abortcontroller。

Generator 本身不直接支持异步任务的暂停与取消,它只提供一种可中断的执行机制(通过 yield),真正的暂停和取消需要配合外部控制逻辑(如状态标记、return()、throw())和运行时调度器(如手动驱动或封装成 Promise)来实现。
暂停:靠 yield 配合外部驱动控制执行节奏
Generator 函数执行到 yield 就暂停,把控制权交还给调用方。是否继续,由调用方决定——这本身就是“暂停”的体现。
- 每次调用
next()才恢复执行,直到下一个yield或函数结束 - 可以封装一个简单调度器,在特定条件(如用户点击、定时器、响应结果)后再调用
next() - 例如:
function* task() { yield fetch('/api'); console.log('done'); }中,fetch返回的是 Promise,但yield不会自动等待它;需额外处理(见下一点)
让 yield 真正“等待”异步操作:需配合 Promise + 自驱动逻辑
原生 Generator 不自动 await Promise,要让它“暂停等待异步结果”,得手动处理 Promise 的 resolve/reject,并用 next(value) 或 throw(error) 恢复执行。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 常见做法是写一个
run(gen)函数:调用next()→ 检查返回值value是否为 Promise → 是则.then(res => next(res)),否则继续 - 这样就能写出类似
yield fetch('/data').then(res => res.json())的写法(注意:不是await,而是靠运行时解析 Promise 并注入结果) - 这种模式是早期
co库或手写协程的基础,也是async/await的思想雏形
取消:靠提前终止迭代器 + 外部状态协同
Generator 迭代器没有内置“取消”方法,但可通过以下方式模拟取消行为:
-
iterator.return(value):立即结束 Generator,触发finally块(如果有),并返回{ value, done: true };后续再调用next()都返回{ value: undefined, done: true } -
iterator.throw(error):向当前暂停点抛出错误,可被try/catch捕获,适合清理资源或主动中断 - 更实用的做法是结合闭包变量(如
let cancelled = false),在每个yield前检查状态,若已取消就提前return或抛错 - 如果异步操作本身支持取消(如
AbortController),应在yield前传入 signal,并在return()时调用abort()
实际可用的简化方案:用 async function 替代 Generator 处理异步
现代 JavaScript 中,async/await 已覆盖 Generator + Promise 手动调度的大部分场景,且原生支持 await、try/catch、AbortSignal 等取消机制。
- 例如:
async function task(signal) { const res = await fetch('/api', { signal }); return res.json(); },调用时传入AbortController.signal即可取消 - Generator 更适合做同步流程拆分、惰性计算、状态机建模等场景;异步控制流推荐优先使用
async/await - 若必须用 Generator 实现取消,建议封装一层带
abort()方法的包装器,内部管理 signal 和迭代器生命周期
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










