Async iteration combines Promises with the iterator protocol, letting you loop over data that arrives asynchronously — paginated API responses, streaming chunks, event sequences. This article covers for await...of, async generators, and Symbol.asyncIterator.
Prerequisites: Async #3 — Promises, Async #6 — Generators
1. The Problem — Iterating Over Async Data
Regular iteration (for...of) expects synchronous values. When each value requires an async operation, you need something different:
Loading editor...
2. Async Iterables — Symbol.asyncIterator
An async iterable uses Symbol.asyncIterator instead of Symbol.iterator, and its next() returns a Promise of { value, done }:
Loading editor...
3. Async Generators — async function*
Async generators combine generators with async: yield produces values, await pauses for promises:
Loading editor...
4. Building an Async Iterator Manually
Loading editor...
5. Converting an Async Iterable to an Array
There's no spread for async iterables ([...asyncIterable] doesn't work). Build a helper:
Loading editor...
6. Async map, filter, reduce Over Async Iterables
Loading editor...
Key Takeaways
Symbol.asyncIteratorenablesfor await...of—next()returns aPromise<{ value, done }>.async function*creates an async generator —yieldproduces values andawaitpauses.yield*works with both sync and async iterables inside async generators.- No spread for async iterables — use
for await...of+ array push, or a helper. - Async iteration is the natural way to consume: paginated APIs, streaming responses, event sequences, queues.
Next: Async #8 — Concurrency Control & Retry Patterns — execute tasks sequentially, with a concurrency pool, and retry with backoff.
