摘要: 本教程将介绍 JavaScript 异步生成器,它可以迭代异步获取的数据。
什么是异步生成器
异步生成器类似于普通的 生成器,区别在于它的 next() 方法返回一个 Promise。 要迭代异步生成器,请使用 for await...of 语句。
JavaScript 异步生成器简介
普通生成器是一个可以暂停并在暂停处继续执行的函数。 请看以下示例
function* sequence(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
let seq = sequence(1, 5);
for (const num of seq) {
console.log(num);
}
Code language: JavaScript (javascript)sequence 是一个从 start 到 end 返回数字的生成器。
异步生成器类似于普通生成器,但有以下区别
async关键字放在function关键字之前。yield返回一个Promise,而不是一个值。Promise通常是异步操作的包装器。
以下说明了如何将生成器 sequence 转换为异步生成器 asyncSequence
async function* asyncSequence(start, end) {
for (let i = start; i <= end; i++) {
yield new Promise((resolve, reject) => {
setTimeout(() => {
resolve(i);
}, 1000);
});
}
}Code language: JavaScript (javascript)请注意,我们使用了 setTimeout() 来模拟异步操作。
要迭代整个异步生成器,请使用 for await...of 语句。
由于我们只能在 async 函数中使用 await 关键字,因此我们将代码包装在一个异步 IIFE 中,如下所示
(async () => {
let seq = asyncSequence(1, 5);
for await (let num of seq) {
console.log(num);
}
})();
Code language: JavaScript (javascript)该代码每秒返回 1 到 5 的序列。
1
2
3
4
5
Code language: JavaScript (javascript)当您访问数据流并希望报告进度(例如使用进度条)时,异步生成器非常有用。
本教程是否有用?