<p>Generator 和 async 本质不同:Generator 用 function* 声明,yield 暂停需 next() 驱动,返回迭代器;async 用 async function 声明,await 自动等待 Promise,返回 Promise,语义更清晰、错误处理更直观。</p>

Generator 和 async 都用于处理异步逻辑,但它们在函数定义层面的语法、语义和执行机制有本质区别。
函数声明方式不同
Generator 函数在 function 关键字和函数名之间 加一个星号(*),例如:function* fetchData();而 async 函数是在 function 关键字前 加 async 关键字,例如:async function fetchData()。两者位置固定,不可互换或省略。
内部暂停/等待机制不同
Generator 使用 yield 表达式主动交出执行权,每次调用 next() 才推进到下一个 yield 或 return;async 函数使用 await 暂停执行,但无需手动驱动——只要遇到 await,引擎自动等待其后 Promise 完成,然后继续向下执行。
-
yield后只能接 Thunk 函数或 Promise,不能直接接原始值 -
await后可以是任意值:Promise、字符串、数字、布尔值等,非 Promise 值会被自动包装为已 resolve 的 Promise
返回值类型与调用方式不同
Generator 函数调用后立即返回一个 迭代器对象(Iterator),本身不执行任何逻辑;async 函数调用后也立即开始执行(类似普通函数),但返回的是一个 Promise 对象。
- 要运行 Generator,必须反复调用
iterator.next(),或借助 co 等执行器 - async 函数无需额外执行器,直接调用即可,后续用
.then()或顶层await消费结果
语义清晰度与错误处理逻辑不同
async 和 await 是明确的异步语义词:async 表示“这个函数含异步操作”,await 表示“这里要等结果”;而 * 和 yield 更偏向底层状态机概念,初学者不易直觉理解。
- async 函数中任一
await抛错,后续代码不再执行,需靠try...catch捕获 - Generator 中错误需通过
iterator.throw()主动注入,或由执行器统一处理,控制更底层、更灵活但也更繁琐

















