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

处理复杂的异步流程时,Generator函数结合yield关键字能提供一种更线性、可控的执行方式。虽然现在普遍使用async/await,但理解Generator有助于掌握JavaScript异步演进逻辑,并在特定场景(如状态机、流程控制库)中灵活应用。
Generator基础:暂停与恢复执行
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 }
将异步操作交由yield处理
让Generatoryield出一个Promise,外部通过next(value)把异步结果传回,从而模拟同步写法。
需要一个自动执行器函数来递归调用next并处理Promise结果。
function fetchData(url) { return new Promise(resolve => { setTimeout(() => resolve(`Data from ${url}`), 1000); });}function* asyncFlow() {const data1 = yield fetchData('/api/1');console.log(data1); // Data from /api/1const data2 = yield fetchData('/api/2');console.log(data2); // Data from /api/2}
编写自动执行器管理异步流程
手动调用next不现实,需封装执行器自动处理Promise解析和数据回传。
执行器不断调用next,并将Promise的resolve值作为下一次输入。
function run(generatorFn) { const iterator = generatorFn();function handle(result) {if (result.done) return;result.value.then(data => {handle(iterator.next(data));});}
handle(iterator.next());}
run(asyncFlow); // 自动按序执行两个异步请求
应对错误与流程控制
Generator支持try...catch,结合iterator.throw()可在暂停点抛出异常。
这使得异步错误可以在原生语法层级被捕获,提升调试体验。
function* flowWithError() { try { const res = yield Promise.reject('Error occurred'); } catch (err) { console.log('Caught:', err); // Caught: Error occurred }}// 执行器需增强错误处理function runWithCatch(genFn) {const it = genFn();const result = it.next();
result.value.catch(err => {it.throw(err);});}
基本上就这些。Generator配合执行器可实现类似async/await的效果,核心是“yield出异步任务,外部推进并回填结果”。虽然现在多数场景推荐使用async/await,但在需要细粒度控制执行节奏、实现协程或自定义流程引擎时,Generator仍是有力工具。
以上就是如何运用Generator函数与Yield关键字处理复杂的异步流程?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1527734.html
微信扫一扫
支付宝扫一扫