在JavaScript中实现异步迭代器需要使用ES2018中引入的Async Iterator(异步迭代器)和for await...of语句。异步迭代器是一个对象,它实现了一个next方法并返回一个Promise对象。for await...of语句用于遍历异步迭代器返回的Promise对象。
以下是一个异步迭代器的示例代码:
const asyncIterable = {
[Symbol.asyncIterator]() {
let i = 0;
return {
async next() {
if (i < 3) {
await new Promise(resolve => setTimeout(resolve, 1000));
return { value: i++, done: false };
}
return { done: true };
}
};
}
};
async function getData() {
for await (const item of asyncIterable) {
console.log(item);
}
}
getData();
在这个示例中,我们首先定义了一个包含异步迭代器的对象asyncIterable。该迭代器返回一个Promise对象,每次迭代都会等待1秒钟,然后返回一个包含当前迭代值的对象。最后,我们使用for await...of语句遍历异步迭代器并打印每个值到控制台。
需要注意的是,异步迭代器返回的Promise对象应该要么resolve一个包含当前迭代值的对象,要么reject一个错误对象。使用async/await语法可以在异步迭代器中方便地使用异步操作。
除了Async Iterator和for await...of语句之外,我们还可以使用async generator(异步生成器)来实现异步迭代器。异步生成器是一个异步函数,它使用yield*语句返回一个异步迭代器。这个主题超出了本回答的范围,有兴趣的读者可以自行查阅相关文档。