优秀的编程知识分享平台

网站首页 > 技术文章 正文

JavaScript开发人员都应知道的异步迭代,你会了吗?

nanyue 2024-10-24 11:44:41 技术文章 4 ℃


Asynchronous Iteration(异步迭代)

对数据集合进行迭代是编程的一个重要部分。

在ES2015之前,JavaScript提供了for, for…以及map()、filter()和forEach()等方法。

为了让程序员能够一次处理一个集合中的元素,ES2015引入了iterator接口。

如果对象具有符号,则该对象是可迭代的。

迭代器属性。

在ES2015中,字符串和集合对象(如Set、Map和Array)都带有一个符号。

属性,因此是可迭代的。

下面的代码给出了一个如何一次访问一个可迭代元素的例子:


Symbol.iterator是一个众所周知的符号,用于指定返回迭代器的函数。


与迭代器交互的主要方法是next()方法。

此方法返回具有两个属性的对象:value和done。

value属性包含集合中下一个元素的值。

done属性包含true或false,表示集合的结束是否已经到达。

默认情况下,普通对象是不可迭代的,但是如果您定义一个符号,它就可以成为可迭代的。

迭代器属性,如下例所示:


这个对象是可迭代的,因为它定义了一个符号。

迭代器属性。

迭代器使用object .keys()方法获取对象属性名的数组,然后将其分配给值常量。

它还定义了一个计数器变量,并给它一个初始值0。

当迭代器被执行时,它返回一个包含next()方法的对象。

每次调用next()方法时,它返回一个{value, done}对,值保存集合中的下一个元素,done保存一个布尔值,指示迭代器是否达到集合的需要。

虽然这段代码工作得很完美,但它的复杂性是不必要的。

幸运的是,使用生成器函数可以大大简化这个过程:


在这个生成器中,a代表…循环用于枚举集合并生成每个属性的值。

结果与前面的示例完全相同,但短得多。

迭代器的缺点是它们不适合表示异步数据源。

解决这个问题的方法是异步迭代器和异步迭代器。

异步迭代器与传统迭代器的不同之处在于,它不以{value, done}的形式返回普通对象,而是返回一个实现为{value, done}的承诺。


异步迭代器定义一个符号。

返回异步迭代器的asyncIterator方法(而不是Symbol.iterator)。

举个例子就能说明这一点:


注意,不可能使用承诺的迭代器来实现相同的结果。

虽然一个普通的同步迭代器可以异步地确定值,但它仍然需要同步地确定“done”的状态。

同样,你可以使用生成器函数简化这个过程,如下所示:


通常,生成器函数使用next()方法返回生成器对象。

调用next()时,它返回一个{value, done}对,其值属性保存生成的值。

异步生成器做同样的事情,只是它返回一个实现为{value, done}的承诺。

在可迭代对象上进行迭代的一种简单方法是使用for…的声明。

但对于……of不能与异步迭代的值一起工作,并且done不是同步确定的。

基于这个原因,ES2018提供了等待……的声明。

让我们看一个例子:


在此代码中,for…wait…的语句隐式调用符号。

方法获取一个异步迭代器。

每次通过循环时,都会调用迭代器的next()方法,该方法返回一个promise。

一旦承诺被解析,得到的对象的value属性被读取到x变量。

循环继续,直到返回对象的done属性的值为true。

记住,等待……of语句仅在异步生成器和异步函数中有效。

违反此规则将导致SyntaxError。

通常,生成器函数使用next()方法返回生成器对象。

调用next()时,它返回一个{value, done}对,其值属性保存生成的值。

异步生成器做同样的事情,只是它返回一个实现为{value, done}的承诺。

在可迭代对象上进行迭代的一种简单方法是使用for…的声明。

但对于……of不能与异步迭代的值一起工作,并且done不是同步确定的。

基于这个原因,ES2018提供了等待……的声明。

让我们看一个例子:


在此代码中,for…wait…的语句隐式调用符号。

方法获取一个异步迭代器。

每次通过循环时,都会调用迭代器的next()方法,该方法返回一个promise。

一旦承诺被解析,得到的对象的value属性被读取到x变量。

循环继续,直到返回对象的done属性的值为true。

记住,等待……of语句仅在异步生成器和异步函数中有效。

违反此规则将导致SyntaxError。

声明:文章内容源于网络,如有侵权,请与我们联系删除或授权事宜

今天就到这里啦,喜欢编程的小伙伴可以关注我哦!有学习方面的问题可以私信回复:学习!

Tags:

最近发表
标签列表