异步迭代与生成器结合,使JavaScript能直观处理异步数据流。通过Symbol.asyncIterator和for await…of,可同步风格遍历异步序列;async function*支持await与yield,适用于文件流、网络请求等场景。

在 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。
配合 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异步迭代的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539306.html
微信扫一扫
支付宝扫一扫