JavaScript迭代器和生成器本身不直接处理异步操作,但提供可暂停、可恢复的底层机制,配合async/await或手动调度可简化异步流程;迭代器是含next()方法的对象,返回{value, done},实现可遍历协议。

JavaScript 迭代器(Iterator)和生成器(Generator)本身并不直接处理异步操作,但它们为编写可暂停、可恢复的代码提供了底层机制,配合 async/await 或手动调度,能显著简化异步流程的组织与控制。
迭代器是一个具有 next() 方法的对象,每次调用返回形如 { value, done } 的结果。它定义了如何按需逐个产出值,不依赖数组或循环结构。
例如,手动实现一个简单计数迭代器:
const counter = {
[Symbol.iterator]() {
let i = 0;
return {
next() {
if (i < 3) return { value: i++, done: false };
return { value: undefined, done: true };
}
};
}
};
[...counter]; // [0, 1, 2]
关键点:
立即学习“Java免费学习笔记(深入)”;
[Symbol.iterator](),就能被 for...of、扩展运算符等消费next() 返回 Promise)生成器函数用 function* 声明,内部可用 yield 暂停执行,并把值交还给调用方;下次调用 next() 时从中断处继续。
它自动返回一个符合迭代器协议的对象:
function* idGenerator() {
let id = 1;
while (true) yield id++;
}
const gen = idGenerator();
gen.next().value; // 1
gen.next().value; // 2
生成器的核心价值在于“执行可控”——你可以决定何时推进、是否传入参数、甚至中途抛出错误。
纯生成器仍是同步的,但把它和 Promise 结合,就能构建类 async/await 的流程。历史上 co 库就是这么做的:它自动遍历生成器,遇到 yield Promise 就等待其 resolve,再把结果传回 next()。
现代写法更直接:生成器 + async 函数协作:
async 函数驱动它,每次 yield 后 await 对应的 Promiseasync 更灵活(比如可重试某一步、动态跳过步骤)例如,模拟分步加载:
function* fetchFlow() {
const token = yield fetch('/login');
const data = yield fetch('/api?token=' + token);
return yield render(data);
}
<p>// 驱动器(简化版)
async function run(gen) {
const g = gen();
function next(v) {
const { value, done } = g.next(v);
return done ? value : value.then(next);
}
return next();
}
虽然生成器曾用于异步方案,但如今 async/await 已成标准,更简洁可靠。不过以下场景仍可见生成器身影:
for await...of 的日志流、WebSocket 消息队列yield new Promise(r => setTimeout(r, 100)) 控制节奏迭代器协议也支撑了 for await...of,这是处理异步可迭代对象(如 ReadableStream)的官方方式。
以上就是什么是javascript迭代器与生成器_它们如何简化异步操作?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号