讲师中心 微信公众号
AI工具推荐 视频效率加速

异步迭代:for await...of循环用法

小磊小哥_2861

小磊小哥_2861

发布时间:2025-11-19 21:25:02

|

920人浏览过

|

来源于php中文网

原创

异步迭代是JavaScript中按需逐步消费异步值的机制,for await...of可在async函数中遍历异步可迭代对象,自动等待每个Promise解析,适用于异步生成器、流数据处理等场景。

异步迭代:for await...of循环用法

在处理异步数据流时,比如从网络请求、文件读取或数据库查询中逐个获取数据,for await...of 循环提供了一种简洁且直观的方式来遍历异步可迭代对象。它适用于返回 Promise 的异步生成器或任何实现了异步迭代协议的对象。

什么是异步迭代?

JavaScript 中的异步迭代允许你按需、逐步地消费异步产生的值。与普通 for...of 不同,for await...of 能自动等待每个异步值的解析完成后再继续下一轮循环。

要支持异步迭代,对象必须实现 [Symbol.asyncIterator] 方法,该方法返回一个包含 next() 方法的对象,而 next() 返回的是 { value, done } 形式的 Promise。

基本语法和使用场景

for await...of 的语法类似于 for...of,但它只能在 async 函数内部使用。

常见用途包括:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
  • 读取异步生成的数据(如异步生成器函数)
  • 处理流式数据(如 Node.js 中的 Readable Stream)
  • 分页接口拉取远程数据

示例:使用异步生成器产生延迟数值

async function* generateNumbers() {
  yield await new Promise(resolve => setTimeout(() => resolve(1), 1000));
  yield await new Promise(resolve => setTimeout(() => resolve(2), 1000));
  yield await new Promise(resolve => setTimeout(() => resolve(3), 1000));
}
<p>async function consume() {
for await (const num of generateNumbers()) {
console.log(num); // 每隔一秒输出 1, 2, 3
}
}
consume();</p>

处理异步可迭代对象(如 fetch 分块响应)

fetch API 返回的 Response.body 是一个可读流(ReadableStream),它实现了异步迭代器,可用于逐块处理大型响应内容。

示例:逐段读取文本响应

async function readStream() {
  const response = await fetch('https://example.com/large-text');
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
<p>for await (const chunk of readableStreamToAsyncIterable(reader)) {
console.log(decoder.decode(chunk));
}
}</p><p>// 辅助函数:将 ReadableStream 转为异步可迭代对象
function readableStreamToAsyncIterable(reader) {
return {
[Symbol.asyncIterator]() {
return this;
},
async next() {
const { done, value } = await reader.read();
if (done) return { done: true };
return { value, done: false };
}
};
}</p>

注意事项和限制

使用 for await...of 时需注意以下几点:

  • 必须在 async 函数中使用,否则会抛出语法错误
  • 仅适用于实现了异步迭代协议的对象(即有 [Symbol.asyncIterator])
  • 同步可迭代对象(如数组)虽然可以用,但不推荐,因为会造成不必要的 await 开销
  • 无法直接中断异步迭代流,break 和 return 可以退出循环,但不会取消正在进行的操作

基本上就这些。for await...of 让你在面对异步数据流时,代码更清晰、逻辑更连贯,特别适合现代 Web API 和流式处理场景。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3140

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

847

2025.10.24

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

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

3228

2023.10.19

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

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

5309

2025.10.17

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

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

3869

2025.12.29

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

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

486

2026.01.19

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

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

4816

2023.06.20

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

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

1415

2023.07.28

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn