JavaScript - Symbol.asyncIterator 属性
Symbol.asyncIterator 属性用于定义对象的异步迭代方法。该属性在 ECMAScript 2018 规范中引入,用于支持 JavaScript 异步迭代协议。JavaScript 通常允许使用 for...of 循环进行同步迭代,这些循环可以操作各种可迭代对象,包括集合、数组、字符串、映射等等。然而,当迭代需要异步操作时,例如从服务器检索数据或从流中读取数据,同步迭代就不合适了。
为了解决这个问题,ECMAScript 引入了异步迭代器的概念和 Symbol.asyncIterator 属性。此内置符号使对象成为异步可迭代对象,从而实现异步迭代。
语法
以下是 JavaScript Symbol.asynciterator 属性的语法 -
[Symbol.asyncIterator]()
参数
此属性不接受任何类型的参数。
返回值
此属性返回异步迭代器对象的值。
示例
示例 1
让我们看下面的示例,我们将使用 for await of 循环通过 symbol.asyncIterator 创建一个异步可迭代对象。
<html>
<body>
<script>
const x = {
async *[Symbol.asyncIterator]() {
yield 11 + " < br > ";
yield 4 + " < br > ";
yield 33 + " < br > ";
}
};
(async () => {
for await (const a of x) {
document.write(a);
}
})();
</script>
</body>
</html>
如果我们执行上述程序,它将在网页上显示该数字。
示例 2
考虑另一种场景,我们将定义一个异步生成器函数,该函数返回一个异步可迭代对象。
<html>
<body>
<script>
async function* x() {
yield 'Ram';
yield 'Rahul';
yield 'Ravi';
}
(async () => {
for await (const a of x()) {
document.write(a + " < br > ");
}
})();
</script>
</body>
</html>
执行上述脚本后,网页上将显示一段文本。
示例 3
在下面的示例中,我们将使用 Symbol.asyncIterator 创建一个自定义异步可迭代类,该类可产生值。
<html>
<body>
<script>
class x {
constructor() {
this.a = [1, 2, 3];
}
async *[Symbol.asyncIterator]() {
for (const y of this.a) {
await new Promise(resolve => setTimeout(resolve, 100));
yield y;
}
}
}
(async () => {
for await (const b of new x()) {
document.write(b + " < br > ");
}
})();
</script>
</body>
</html>
当我们执行脚本时,它将在网页上显示一段文本。

