0

0

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

夢幻星辰

夢幻星辰

发布时间:2025-11-25 16:09:12

|

284人浏览过

|

来源于php中文网

原创

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

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 }</p>

用Generator控制异步任务

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

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

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

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

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

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

万兴爱画
万兴爱画

万兴爱画AI绘画生成工具

下载
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;">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); // 按顺序输出,无需嵌套回调</p>

Generator与现代异步方案的对比

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

557

2023.09.20

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

419

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

534

2024.05.29

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

495

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

166

2023.10.07

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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