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

迭代器与生成器_javascript异步迭代

狼影
发布: 2025-11-30 20:49:44
原创
292人浏览过
异步迭代与生成器结合,使JavaScript能直观处理异步数据流。通过Symbol.asyncIterator和for await...of,可同步风格遍历异步序列;async function*支持await与yield,适用于文件流、网络请求等场景。

迭代器与生成器_javascript异步迭代

在 JavaScript 中,迭代器(Iterator)和生成器(Generator)是处理数据序列的重要机制。随着异步编程的普及,异步迭代(asynchronous iteration)成为处理异步数据流的标准方式。它让开发者可以用类似同步 for...of 的语法安全地遍历异步数据源,比如从网络分块读取数据或监听事件流。

迭代器与可迭代对象

JavaScript 中,一个对象如果实现了 [Symbol.iterator] 方法,并返回一个带有 next() 方法的对象,就被称为可迭代对象。next() 返回形如 { value, done } 的结果。

例如,数组、字符串、Map 等都是内置可迭代对象:

const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator](); iterator.next(); // { value: 1, done: false } iterator.next(); // { value: 2, done: false } iterator.next(); // { value: 3, done: false } iterator.next(); // { value: undefined, done: true }

生成器:简化迭代器创建

生成器函数用 function* 定义,调用后返回一个生成器对象,它既是迭代器也是可迭代对象。使用 yield 可以暂停执行并返回值。

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

这使得创建复杂迭代逻辑变得简单:

function* numberGen() { yield 1; yield 2; yield 3; }

for (const num of numberGen()) { console.log(num); // 依次输出 1, 2, 3 }

异步迭代:处理异步数据流

当数据不是立即可用,而是通过 Promise 逐步到达时,就需要异步迭代。此时使用 [Symbol.asyncIterator],返回一个对象,其 next() 方法返回 Promise<{ value, done }>。

iter-master生成器提供迭代原语的PHP库
iter-master生成器提供迭代原语的PHP库

iter-master生成器提供迭代原语的PHP库

iter-master生成器提供迭代原语的PHP库 51
查看详情 iter-master生成器提供迭代原语的PHP库

配合 for await...of 语法,可以像同步一样处理异步序列:

const asyncIterable = { async *[Symbol.asyncIterator]() { await new Promise(r => setTimeout(r, 100)); yield "first"; await new Promise(r => setTimeout(r, 100)); yield "second"; } };

(async () => { for await (const value of asyncIterable) { console.log(value); // 先输出 "first",再输出 "second" } })();

常见应用场景包括读取文件流、数据库游标、WebSocket 消息流等。

生成器与异步迭代结合

使用生成器函数结合 async/await,可以轻松实现异步生成器。只需定义 async function*,内部可用 await 处理异步操作,同时支持 yield 返回值。

这种模式非常适合构建延迟加载的数据管道:

async function* fetchLines(url) { const response = await fetch(url); const reader = response.body.getReader(); const decoder = new TextDecoder();
let buffer = '';
while (true) {
  const { value, done } = await reader.read();
  if (done) break;

  buffer += decoder.decode(value, { stream: true });
  const lines = buffer.split('\n');
  buffer = lines.pop(); // 保留未完整行

  for (const line of lines) {
    yield JSON.parse(line);
  }
}
登录后复制

}

// 使用 (async () => { for await (const record of fetchLines('/logs')) { console.log(record); // 每一行日志解析后输出 } })();

基本上就这些。异步迭代让处理逐步到达的数据变得更直观,而生成器极大简化了迭代逻辑的编写。两者结合,是现代 JavaScript 中处理流式异步数据的有力工具

以上就是迭代器与生成器_javascript异步迭代的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源: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号