在 javascript 中,`async` 函数与 `await` 关键字可以无缝配合 `async` 迭代器(async iterators)使用,通过 `for await...of` 循环来顺序处理异步生成的数据流。具体做法是在 `async` 函数内部直接使用 `for await (const item of asynciterable)` 语法,这样每次迭代都会自动等待下一个 promise 解析完成,从而避免手动管理复杂的 promise 链或回调。

如何定义并消费一个异步生成器
要创建一个异步迭代器,需要定义一个返回 AsyncIterator 对象的函数,通常使用 `async function*` 语法糖来实现。消费端则必须在一个 `async` 函数中使用 `for await...of` 语句进行遍历,任何非 `async` 环境下的普通 `for...of` 都无法正确等待异步值。

async function* generateNumbers() {
for (let i = 0; i < 3; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
yield i;
}
}
async function consumeData() {
const results = [];
for await (const num of generateNumbers()) {
results.push(num * 2);
}
console.log(results); // [0, 2, 4]
}如何处理异步迭代中的错误
当异步迭代器在生成过程中抛出异常,或者在消费端处理单个元素时发生错误,`for await...of` 循环会立即终止并向上抛出该错误。为了保持程序的健壮性,必须将整个迭代逻辑包裹在 `try...catch` 块中,以便捕获并处理来自迭代器内部的拒绝(Rejection)或同步错误。
立即学习“Java免费学习笔记(深入)”;

async function* errorGenerator() {
yield 1;
throw new Error('Iteration failed');
yield 2;
}
async function handleErrors() {
try {
for await (const val of errorGenerator()) {
console.log(val);
}
} catch (err) {
console.error(err.message); // 'Iteration failed'
}
}异步迭代器在空输入时的行为表现
当传入的异步可迭代对象为空时,`for await...of` 循环不会执行任何迭代步骤,而是直接正常退出,不会抛出错误。此时,如果在循环外部定义了累加变量,其值将保持初始状态,这允许代码在不产生副作用的情况下安全地处理空数据流场景。


















