基本
JavaScript Iterator
是一个带有 .next()
方法的对象,它返回一个 IteratorItem
,它是 value : <any>
和 done : <boolean>
的对象。
JavaScript AsyncIterator
是一个带有 .next()
方法的对象,它返回一个 Promise<IteratorItem>
,一个下一个值的 promise 。
要创建 AsyncIterator,我们可以使用异步生成器语法:
/**
* Returns a promise which resolves after time had passed.
*/
const delay = time => new Promise(resolve => setTimeout(resolve, time));
async function* delayedRange(max) {
for (let i = 0; i < max; i++) {
await delay(1000);
yield i;
}
}
delayedRange
函数将采用最大数字,并返回 AsyncIterator
,其产生从 0 到该数字的数字,间隔为 1 秒。
用法:
for await (let number of delayedRange(10)) {
console.log(number);
}
for await of
循环是另一种新语法,仅在异步函数内部以及异步生成器中可用。在循环内部,所产生的值(记住,是 Promises)被解开,因此 Promise 被隐藏起来。在循环中,你可以处理直接值(产生的数字),for await of
循环将代表你等待 Promises。
上面的示例将等待 1 秒,记录 0,等待另一秒,记录 1,依此类推,直到记录为止 9.此时 AsyncIterator
将为 done
,并且 for await of
循环将退出。