0

0

什么是Javascript的生成器函数_如何使用Javascript生成器处理异步迭代?

紅蓮之龍

紅蓮之龍

发布时间:2026-01-02 22:45:09

|

510人浏览过

|

来源于php中文网

原创

生成器函数是带暂停能力的函数,通过function和yield实现执行暂停与恢复,返回generator对象;async function则返回asyncgenerator,其next()返回promise,需用for await...of消费。

什么是javascript的生成器函数_如何使用javascript生成器处理异步迭代?

生成器函数是什么:带暂停能力的函数

生成器函数不是普通函数,它能中途暂停执行、交出控制权,并在后续恢复。关键在于 function* 语法和 yield 表达式——每次遇到 yield,函数就停住,把值“吐出来”,等下次调用 next() 再继续。

它返回一个迭代器对象(Generator),不是直接返回结果。这个对象自带 next()return()throw() 方法,是手动控制执行节奏的基础。

async function* 实现异步迭代

ES2018 起支持 async function*,它返回的是 AsyncGenerator,其 next() 方法返回 Promise,而不是普通对象。这意味着你可以 await 每次产出,也能在 yield 后面放 Promise(比如 fetch 或数据库查询)。

常见错误是误以为 async function* 能直接 await yield——不行。yield 本身不支持 await,但你可以 yield await someAsyncOp(),或者更常见的是 yield fetch(url),然后在消费端 await 迭代结果。

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

Dora
Dora

创建令人惊叹的3D动画网站,无需编写一行代码。

下载
  • yield 后面可以是任意值,包括 Promise;但 yield 不会自动 await 它
  • 消费时必须用 for await...of,不能用普通 for...of
  • 如果生成器内部抛出异步错误(如 fetch 失败),需在消费侧用 try/catch 捕获
async function* fetchPages() {
  for (let i = 1; i <= 3; i++) {
    const res = await fetch(`/api/items?page=${i}`);
    const data = await res.json();
    yield data.items;
  }
}
<p>// 正确消费方式
(async () => {
for await (const items of fetchPages()) {
console.log(items.length);
}
})();

next()for await...of 的行为差异

next() 是底层接口,每次调用返回 { value, done } 形式的 Promise(对 AsyncGenerator)。而 for await...of 是语法糖,它自动调用 next()await 其返回的 Promise,直到 done: true

容易踩的坑:手动调用 next() 时忘记 await,导致拿到的是 pending Promise 而非实际值;或在循环中混用 await iterator.next()for await...of,造成重复消费或跳过项。

  • iterator.next() 返回 Promise
  • for await...of 隐式处理 awaitdone 判断,更安全简洁
  • 若需提前终止(如用户取消),可调用 iterator.return(),触发生成器内 finally 块(如果有)

为什么不用 Promise.all 而用生成器?

因为顺序依赖、流式处理、内存可控。比如拉取分页列表,你不想一次性发 100 个请求,也不愿等全部加载完才开始渲染。生成器让你按需拉取、边拉边用。

另一个典型场景是 WebSocket 消息流或 Node.js 中的 ReadableStream 管道——它们天然适合用 for await...of 消费,而生成器可封装转换逻辑(如过滤、节流、重试)。

注意:async function* 本身不解决错误重试或背压控制,这些得靠额外逻辑实现。比如想对失败的 fetch 自动重试三次,得在生成器内部写循环+try/catch,而不是依赖生成器机制。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

366

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1876

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

636

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2382

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

556

2023.07.28

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

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

精品课程

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

共58课时 | 5.9万人学习

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号