首页 > web前端 > js教程 > 正文

JavaScript协程实现_Generator异步流程控制

夢幻星辰
发布: 2025-11-25 16:09:12
原创
208人浏览过
<p>JavaScript中通过Generator函数实现协程,使用function定义并返回迭代器,调用next()可暂停和恢复执行,yield用于暂停并返回值,next再启动生成器。示例展示其逐步执行特性:function simpleGen() { yield '第一步'; yield '第二步'; return '完成'; } const gen = simpleGen(); console.log(gen.next()); // { value: '第一步', done: false } console.log(gen.next()); // { value: '第二步', done: false } console.log(gen.next()); // { value: '完成', done: true } 可将异步操作封装在yield后,由运行器捕获Promise并在resolve后通过next送回结果,实现同步写法处理异步逻辑。运行器递归调用next,监听Promise状态,如:function run(generatorFn) { const iterator = generatorFn(); function handle(result) { if (result.done) return Promise.resolve(result.value); return Promise.resolve(result.value).then(data => handle(iterator.next(data))).catch(err => handle(iterator.throw(err))); } try { return handle(iterator.next()); } catch (err) { return Promise.reject(err); } } 使用delay模拟异步:function delay(ms, value) { return new Promise(resolve => setTimeout(() => resolve(value), ms)); } function* asyncFlow() { const data1 = yield delay(1000, '第一次完成'); console.log(data1); const data</p>

javascript协程实现_generator异步流程控制

JavaScript中的协程通过Generator函数实现,为异步流程控制提供了更优雅的解决方案。它能让函数执行到某一步暂停,等异步操作完成后再恢复,从而以同步写法处理异步逻辑。

Generator基础:暂停与恢复执行

Generator函数是协程在JavaScript中的实现方式,定义时使用function*语法。调用后返回一个迭代器对象,可通过next()方法控制执行流程。

每次遇到yield表达式,函数会暂停,并将值返回给调用者;下一次调用next()时继续执行,直到遇到下一个yield或函数结束。

示例:
function* simpleGen() {
  yield '第一步';
  yield '第二步';
  return '完成';
}
<p>const gen = simpleGen();
console.log(gen.next()); // { value: '第一步', done: false }
console.log(gen.next()); // { value: '第二步', done: false }
console.log(gen.next()); // { value: '完成', done: true }
登录后复制

用Generator控制异步任务

将异步操作封装在yield后,由外部运行器捕获并执行回调,完成后将结果送回Generator继续执行,形成“暂停→等待→恢复”的流程。

立即学习Java免费学习笔记(深入)”;

常见模式是让yield后跟一个Promise,运行器自动监听其完成状态。

Levity
Levity

AI帮你自动化日常任务

Levity 206
查看详情 Levity
基本思路:
  • Generator产出一个Promise
  • 运行器监听Promise的resolve/reject
  • 结果通过next(value)throw(error)送回函数体内
  • 函数继续执行,像同步代码一样处理结果

手动实现一个简单的运行器

运行器(Runner)是驱动Generator自动执行的核心。它递归调用next(),并在Promise完成时传入结果。

function run(generatorFn) {
  const iterator = generatorFn();
<p>function handle(result) {
if (result.done) return Promise.resolve(result.value);</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">return Promise.resolve(result.value)
  .then(data => handle(iterator.next(data)))
  .catch(err => handle(iterator.throw(err)));
登录后复制

}

try { return handle(iterator.next()); } catch (err) { return Promise.reject(err); } }

使用示例:

function delay(ms, value) {
  return new Promise(resolve => setTimeout(() => resolve(value), ms));
}
<p>function* asyncFlow() {
const data1 = yield delay(1000, '第一次完成');
console.log(data1);</p><p>const data2 = yield delay(500, '第二次完成');
console.log(data2);</p><p>return '全部结束';
}</p><p>run(asyncFlow); // 按顺序输出,无需嵌套回调
登录后复制

Generator与现代异步方案的对比

虽然Generator曾是异步编程的重要突破,但如今已被async/await取代。后者本质上是Generator + Promise的语法糖,但更简洁、易读。

优点:
  • 以同步形式书写异步逻辑,减少回调地狱
  • 支持try/catch处理异步错误
  • 可组合多个异步步骤,便于调试和维护
局限:
  • 需配合运行器使用,不够原生
  • 错误传播需手动处理
  • 语法复杂度高,不如async/await直观

基本上就这些。Generator展示了JavaScript如何通过协程思想改善异步控制流,虽然后续被更优方案替代,但理解其原理对掌握现代异步机制仍有帮助。

以上就是JavaScript协程实现_Generator异步流程控制的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号