Symbol.asyncIterator 属性用于定义对象上的异步迭代方法。它是在 ECMAScript 2018 规范中引入的,用于启用 JavaScript 异步迭代协议。JavaScript 通常允许使用 for...of 循环,它可以对各种可迭代对象进行操作,包括 set、array、strings、map 等。但是,在迭代需要异步操作(例如,从服务器检索数据或从流中读取)的情况下,同步迭代是不合适的。
为了克服这个问题,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>
当我们执行脚本时,它会在网页上显示一个文本。