异步迭代与生成器结合,使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<{ value, done }>。
配合 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速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号