The Symbol.asyncIterator well-known symbol specifies the default async iterator for an object. If this property is set on an object, it is an async iterable and can be used in a for await...of loop.


The Symbol.asyncIterator symbol is a builtin symbol that is used to access an object's @@asyncIterator method. In order for an object to be async iterable, it must have a Symbol.asyncIterator key.

Property attributes of Symbol.asyncIterator
Writable no
Enumerable no
Configurable no


User-defined async iterables

You can define your own async iterable by setting the [Symbol.asyncIterator] property on an object.

const myAsyncIterable = {
  async *[Symbol.asyncIterator]() {
    yield "hello";
    yield "async";
    yield "iteration!";

(async () => {
  for await (const x of myAsyncIterable) {
// Logs:
// "hello"
// "async"
// "iteration!"

When creating an API, remember that async iterables are designed to represent something iterable — like a stream of data or a list —, not to completely replace callbacks and events in most situations.

Built-in async iterables

There are currently no built-in JavaScript objects that have the [Symbol.asyncIterator] key set by default. However, WHATWG Streams are set to be the first built-in object to be async iterable, with [Symbol.asyncIterator] recently landing in the spec.


ECMAScript Language Specification
# sec-symbol.asynciterator

Browser compatibility

BCD tables only load in the browser

See also