Generator函数通过yield暂停执行,结合自动执行器可管理异步流程,实现类似async/await的同步写法,适用于状态机与流程控制。

处理复杂的异步流程时,Generator函数结合yield关键字能提供一种更线性、可控的执行方式。虽然现在普遍使用async/await,但理解Generator有助于掌握JavaScript异步演进逻辑,并在特定场景(如状态机、流程控制库)中灵活应用。
Generator函数通过function*定义,调用后返回一个迭代器对象,不会立即执行内部代码。每次调用next()才会运行到下一个yield表达式,实现分步执行。
利用这一特性,可以把异步操作“暂停”在yield处,等待结果返回后再继续。
function* simpleGen() {
console.log('Step 1');
yield 'A';
console.log('Step 2');
yield 'B';
}
const gen = simpleGen();
gen.next(); // 输出 Step 1,返回 { value: 'A', done: false }
gen.next(); // 输出 Step 2,返回 { value: 'B', done: false }
让Generatoryield出一个Promise,外部通过next(value)把异步结果传回,从而模拟同步写法。
需要一个自动执行器函数来递归调用next并处理Promise结果。
function fetchData(url) {
return new Promise(resolve => {
setTimeout(() => resolve(`Data from ${url}`), 1000);
});
}
<p>function* asyncFlow() {
const data1 = yield fetchData('/api/1');
console.log(data1); // Data from /api/1
const data2 = yield fetchData('/api/2');
console.log(data2); // Data from /api/2
}</p>手动调用next不现实,需封装执行器自动处理Promise解析和数据回传。
执行器不断调用next,并将Promise的resolve值作为下一次输入。
function run(generatorFn) {
const iterator = generatorFn();
<p>function handle(result) {
if (result.done) return;
result.value.then(data => {
handle(iterator.next(data));
});
}</p><p>handle(iterator.next());
}</p><p>run(asyncFlow); // 自动按序执行两个异步请求</p>Generator支持try...catch,结合iterator.throw()可在暂停点抛出异常。
这使得异步错误可以在原生语法层级被捕获,提升调试体验。
function* flowWithError() {
try {
const res = yield Promise.reject('Error occurred');
} catch (err) {
console.log('Caught:', err); // Caught: Error occurred
}
}
<p>// 执行器需增强错误处理
function runWithCatch(genFn) {
const it = genFn();
const result = it.next();</p><p>result.value.catch(err => {
it.throw(err);
});
}</p>基本上就这些。Generator配合执行器可实现类似async/await的效果,核心是“yield出异步任务,外部推进并回填结果”。虽然现在多数场景推荐使用async/await,但在需要细粒度控制执行节奏、实现协程或自定义流程引擎时,Generator仍是有力工具。
以上就是如何运用Generator函数与Yield关键字处理复杂的异步流程?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号