网站首页 > 技术文章 正文
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。
声明:文章内容源于网络,如有侵权,请与我们联系删除或授权事宜
今天就到这里啦,喜欢编程的小伙伴可以关注我哦!有学习方面的问题可以私信回复:学习!
猜你喜欢
- 2024-10-24 Service Workers - JS API 简介(servicedescriptor)
- 2024-10-24 web性能优化的15条实用技巧(web应用性能优化思路)
- 2024-10-24 如何在 Service Worker 重新启动时重用信息
- 2024-10-24 Python在selenium里面注入JavaScript程序的方法
- 2024-10-24 requireJS 实战(requirejs define)
- 2024-10-24 面试妥了!2020 爬虫面试题目合集(爬虫面试经历)
- 2024-10-24 Nest.js 从零到壹系列(一):项目创建&路由设置&模块
- 2024-10-24 JS小知识,分享 7 个高频的工具函数,也许你用的上
- 2024-10-24 如何使用Playwright优化测试性能(play—player)
- 2024-10-24 WebSocket能干些啥?(websocket作用)
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)