基本

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 迴圈將退出。