Symbol.asyncIterator

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

Symbol.asyncIterator 静态数据属性表示 内置符号 Symbol.asyncIterator异步迭代器协议 会查找此符号以获取返回对象异步迭代器的函数。为了使对象成为异步可迭代对象,它必须具有 [Symbol.asyncIterator] 键。

试一试

const delayedResponses = {
  delays: [500, 1300, 3500],

  wait(delay) {
    return new Promise((resolve) => {
      setTimeout(resolve, delay);
    });
  },

  async *[Symbol.asyncIterator]() {
    for (const delay of this.delays) {
      await this.wait(delay);
      yield `Delayed response for ${delay} milliseconds`;
    }
  },
};

(async () => {
  for await (const response of delayedResponses) {
    console.log(response);
  }
})();

// Expected output: "Delayed response for 500 milliseconds"
// Expected output: "Delayed response for 1300 milliseconds"
// Expected output: "Delayed response for 3500 milliseconds"

内置符号 Symbol.asyncIterator

Symbol.asyncIterator 的属性特性
可写
可枚举
可配置

示例

用户定义的异步可迭代对象

您可以通过在对象上设置 [Symbol.asyncIterator]() 属性来定义自己的异步可迭代对象。

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

(async () => {
  for await (const x of myAsyncIterable) {
    console.log(x);
  }
})();
// Logs:
// "hello"
// "async"
// "iteration!"

在创建 API 时,请记住异步可迭代对象旨在表示可迭代的内容——例如数据流或列表——而不是在大多数情况下完全取代回调和事件。

内置异步可迭代对象

核心 JavaScript 语言中没有异步可迭代对象。一些 Web API,例如 ReadableStream,默认情况下具有 Symbol.asyncIterator 方法。

规范

规范
ECMAScript® 2026 语言规范
# sec-symbol.asynciterator

浏览器兼容性

另见