基本

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 循环将退出。