Skip to main content
JavaScript & the browser·Module C6 · Lesson 7
TaskWrite async function* ticks() that yields 1, 2, 3, each preceded by await new Promise(r => setTimeout(r, 5)). Consume with for-await-of and log each value. Then await the generator into an array via for-await + push, log the joined array.

Async generators — async function*

175 XP11 min
Theory

A stream of values that arrive over time

An async function* yields Promises that resolve to the next value. You consume them with for await...of.

async function* ticks() {
  for (let i = 1; i <= 3; i++) {
    await new Promise(r => setTimeout(r, 10));
    yield i;
  }
}

for await (const v of ticks()) {
  console.log(v); // 1, then 10ms later 2, then 10ms later 3
}

Why this is huge

The same iteration protocol that powers for-of over arrays now powers paginated APIs, server-sent events, file-by-file directory walks. One mental model.

Inside vs outside

Inside the generator: you can await whatever you want before yielding — fetch, sleep, database round-trip.

Outside: you walk it with for await. Same shape as for-of. Same break/continue rules.

Top-level await

Module scripts (<script type="module">) allow top-level await. That's how the task below consumes the async generator without wrapping it in another async function.

🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 10 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.