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