Generator函数通过function*和yield实现执行流暂停恢复,配合Promise与自动执行器可构建类同步异步流程,但需手动处理Promise结果与错误,是比async/await更底层的协程机制。

ES6的Generator函数通过function*声明和yield关键字,天然支持执行流的暂停与恢复,是实现异步任务控制的底层机制之一。它本身不处理异步,但配合Promise、手动调用next()或封装成自动执行器,就能构建出类同步的异步流程。
Generator函数的基本语法与暂停/恢复机制
Generator函数返回一个迭代器对象,调用其next()方法会执行到下一个yield表达式并暂停,返回{ value, done }结构。再次调用next()则从暂停处继续执行。
例如:
function* task() {
console.log('step 1');
yield 'first';
console.log('step 2');
yield 'second';
return 'done';
}
<p>const it = task();
it.next(); // step 1 → { value: 'first', done: false }
it.next(); // step 2 → { value: 'second', done: false }
it.next(); // → { value: 'done', done: true }
用yield暂停异步操作,配合Promise传递结果
Generator不能直接await,但可以把Promise对象yield出去,由外部执行器接收并等待其完成,再把结果传回next(value)恢复执行。
立即学习“Java免费学习笔记(深入)”;
关键点:
-
yield后面可以是Promise,但Generator本身不等待它; - 需要手动调用
next(result)把resolve值注入下一轮执行; - 错误需用
it.throw(err)注入,或在Promisecatch后主动抛出。
封装自动执行器(runner)简化调用
写一个通用runner,递归调用next(),遇到Promise就then后继续next,实现自动“等待-恢复”:
function run(genFn) {
const it = genFn();
<p>function next(data) {
const res = it.next(data);
if (res.done) return res.value;
return Promise.resolve(res.value).then(next);
}</p><p>return next();
}</p><p>// 使用示例
function* fetchUser() {
const res = yield fetch('/api/user');
const user = yield res.json();
console.log(user.name);
}</p><p>run(fetchUser); // 自动处理fetch和json两个异步步骤
与async/await对比:Generator是更底层的协程模型
Generator提供的是**可中断的函数执行权**,开发者掌控暂停/恢复时机;而async/await是语法糖,底层也基于Promise+状态机,但隐藏了迭代器细节。
实际开发中,async/await更简洁安全;Generator适合需要精细控制流程(如状态机、协作式多任务、自定义调度)或学习异步原理的场景。
注意:yield无法直接捕获Promise rejection,必须靠try/catch + it.throw()或在runner中统一处理reject。


















