0

0

JavaScript原生异步迭代器Symbol-asyncIterator

冰川箭仙

冰川箭仙

发布时间:2026-03-16 21:47:57

|

782人浏览过

|

来源于php中文网

原创

Symbol.asyncIterator 是 JavaScript 中实现异步迭代的核心机制,使对象支持 for await...of;其方法返回含 Promise 形式 next() 的异步迭代器,用于处理分页、事件流等异步数据流。

javascript原生异步迭代器symbol-asynciterator

JavaScript 中的 Symbol.asyncIterator 是原生支持异步迭代的核心机制,它让对象可以被 for await...of 循环消费,适用于按需获取 Promise 驱动的数据流(比如分页请求、事件流、数据库游标等)。

什么是 asyncIterator?

它是对象上一个方法,键为 Symbol.asyncIterator,返回一个符合异步迭代器协议的对象:该对象必须有 next() 方法,且该方法返回 Promise<{ value: any, done: boolean }>

与同步 Symbol.iterator 不同,asyncIteratornext() 不直接返回结果,而是返回一个 Promise,因此能自然融入异步流程。

如何实现一个自定义 asyncIterator?

只需在对象上定义 [Symbol.asyncIterator]() 方法,并确保它返回一个具备 next() 的对象:

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

  • 每次调用 next() 必须返回 Promise,不能是普通对象
  • done: true 表示迭代结束,后续调用仍应返回 { value: undefined, done: true }
  • 可配合 await 控制节奏,例如模拟延迟加载、分页拉取

示例:一个每秒产出一个数字的异步可迭代对象:

会译·对照式翻译
会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

下载
const counter = {
  [Symbol.asyncIterator]() {
    let i = 0;
    return {
      next() {
        if (i < 3) {
          return Promise.resolve({ value: i++, done: false });
        }
        return Promise.resolve({ value: undefined, done: true });
      }
    };
  }
};
<p>// 使用
for await (const num of counter) {
console.log(num); // 0, 1, 2(依次输出,无等待)
}

哪些内置类型已支持 Symbol.asyncIterator?

现代 JavaScript 引擎(Chrome 63+、Node.js 10+)已为部分类型提供原生 asyncIterator

  • AsyncGeneratorFunction 返回的异步生成器对象(最常见来源)
  • ReadableStream(Web Streams API),可用于读取响应体、文件流等
  • 某些第三方库扩展的对象(如 pg 的查询游标、axios 的流式响应封装)

注意:ArrayMapSet 等同步集合**不原生支持** asyncIterator,需手动包装或借助工具函数转换。

常见使用场景和注意事项

for await...of 是消费 asyncIterator 的标准方式,但它隐含执行顺序和错误传播逻辑:

  • 自动 await 每次 next(),无需手动写 await iterator.next()
  • 异常会中断循环并抛出,可用 try...catch 包裹整个 for await
  • 不支持数组解构或扩展运算符直接展开(如 [...asyncIter] 会报错),需用 Array.fromAsync()(ES2024 提案,尚未广泛支持)或手动收集
  • 避免在 next() 中做不可取消的副作用,因为消费者可能提前 breakreturn

若需兼容旧环境,可用 Babel 转译 for await...of,但 Symbol.asyncIterator 本身需 polyfill(如 es6-symbol + 手动挂载)。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1082

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

851

2023.11.06

es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

234

2025.12.24

java中boolean的用法
java中boolean的用法

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

367

2023.11.13

java boolean类型
java boolean类型

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

42

2025.11.30

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

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

精品课程

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

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

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

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