async函数是基于Generator的语法糖但不兼容Generator,需Generator支持、regenerator-runtime和Promise三者缺一不可。

async 函数本身不是 Generator 的兼容层,而是基于 Generator 实现的语法糖,但两者在运行时并不互相兼容——你不能把 async 函数当 Generator 用,也不能直接用 next() 驱动它。
async 函数依赖 Generator 运行时支持
async 函数在底层会被 Babel 等工具编译为 Generator 函数(配合自动执行器),因此它的实际运行需要目标环境具备 Generator 支持:
- 若浏览器或 Node.js 版本支持
function*和yield(如 Chrome 50+、Firefox 27+、Safari 10+、Node.js 4+),则 async/await 可原生运行或经编译后可靠工作; - 若环境完全不支持 Generator(如 IE9/IE10),即使使用 Babel 编译,也必须引入
regenerator-runtime,否则会报ReferenceError: regeneratorRuntime is not defined; - Babel 的
@babel/plugin-transform-async-to-generator插件负责将async/await转成function*+yield形式,再由regenerator注入执行逻辑。
Generator 无法替代 async 函数语义
虽然 async 是 Generator 的语法糖,但二者行为不可互换:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Generator 返回的是
Iterator对象,需手动调用next()或借助co等执行器;async 函数返回Promise,调用即执行,无需额外驱动; -
await后可接任意值(数字、字符串等,自动转为已 resolve 的 Promise),而yield在标准用法中只接受 Thunk 或 Promise,否则会失去异步意义; - 错误传播机制不同:async 中单个
awaitreject 会终止后续执行(除非捕获),Generator 中未处理的异常仅影响当前next()调用。
兼容性处理的实际建议
要确保 async 函数在旧环境中可用,需同时满足三件事:
立即学习“Java免费学习笔记(深入)”;
- 用 Babel 编译(启用
@babel/preset-env并配置目标浏览器); - 引入
regenerator-runtime(作为 polyfill,在入口文件顶部import 'regenerator-runtime'); - 确保 Promise 已存在(IE11 及更老版本需额外引入
core-js/stable/promise)。
不复杂但容易忽略:async 不是“开箱即用”的语法糖,它背后绑定了 Generator + Promise + 执行器三要素。缺一不可。

















