问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ES6标准入门 摘要 (异步遍历器)

发布网友 发布时间:2022-11-20 16:47

我来回答

1个回答

热心网友 时间:2023-12-24 16:13

变量it是一个遍历器(iterator)。每次调用it.next()方法,就返回一个对象,表示当前遍历位置的信息。

这里隐含着一个规定,it.next()方法必须是同步的,只要调用就必须立刻返回值。也就是说,一旦执行it.next()方法,就必须同步地得到value和done这两个属性。如果遍历指针正好指向同步操作,当然没有问题,但对于异步操作,就不太合适了。

目前的解决方法是,将异步操作包装成 Thunk 函数或者 Promise 对象,即next()方法返回值的value属性是一个 Thunk 函数或者 Promise 对象,等待以后返回真正的值,而done属性则还是同步产生的。

ES2018 引入了“异步遍历器”(Async Iterator),为异步操作提供原生的遍历器接口,即value和done这两个属性都是异步产生。

就像 Generator 函数返回一个同步遍历器对象一样,异步 Generator 函数的作用,是返回一个异步遍历器对象。

异步遍历器的设计目的之一,就是 Generator 函数处理同步操作和异步操作时,能够使用同一套接口。

第一个参数是可遍历对象iterable,第二个参数是一个回调函数func。map的作用是将iterable每一步返回的值,使用func进行处理。

异步 Generator 函数内部,能够同时使用await和yield命令。可以这样理解,await命令用于将外部操作产生的值输入函数内部,yield命令用于将函数内部的值输出。

异步 Generator 函数可以与for await...of循环结合起来使用

如果异步 Generator 函数抛出错误,会导致 Promise 对象的状态变为reject,然后抛出的错误被catch方法捕获

async 函数和异步 Generator 函数,是封装异步操作的两种方法,都用来达到同一种目的。区别在于,前者自带执行器,后者通过for await...of执行,或者自己编写执行器。下面就是一个异步 Generator 函数的执行器。

异步 Generator 函数也可以通过next方法的参数,接收外部传入的数据。同步的数据结构,也可以使用异步 Generator 函数。

异步遍历器的最大的语法特点,就是调用遍历器的next方法,返回的是一个 Promise 对象。

这个 Promise 对象的状态变为resolve以后的回调函数。回调函数的参数,则是一个具有value和done两个属性的对象,这个跟同步遍历器是一样的。

一个对象的同步遍历器的接口,部署在Symbol.iterator属性上面。同样地,对象的异步遍历器接口,部署在Symbol.asyncIterator属性上面。不管是什么样的对象,只要它的Symbol.asyncIterator属性有值,就表示应该对它进行异步遍历。

由于异步遍历器的next方法,返回的是一个 Promise 对象。因此,可以把它放在await命令后面。

异步遍历器的next方法是可以连续调用的,不必等到上一步产生的 Promise 对象resolve以后再调用。这种情况下,next方法会累积起来,自动按照每一步的顺序运行下去。下面是一个例子,把所有的next方法放在Promise.all方法里面。

另一种用法是一次性调用所有的next方法,然后await最后一步操作。

for...of循环用于遍历同步的 Iterator 接口。新引入的for await...of循环,则是用于遍历异步的 Iterator 接口

await用来处理这个 Promise 对象,一旦resolve,就把得到的值(x)传入for...of的循环体。

for await...of循环的一个用途,是部署了 asyncIterable 操作的异步接口,可以直接放入这个循环。

如果next方法返回的 Promise 对象被reject,for await...of就会报错,要用try...catch捕捉。

Node v10 支持异步遍历器,Stream 就部署了这个接口。下面是读取文件的传统写法与异步遍历器写法的差异。

yield*语句也可以跟一个异步遍历器。

与同步 Generator 函数一样,for await...of循环会展开yield*

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
泰迪必备用品有哪些? 养泰迪狗新手需要准备什么东西 谁知道白色泰迪狗的生活用品需要哪些? 美国什么选举时间 离西双版纳最近的地州必去景点 技嘉945GCM-S2L ( 英特尔 945G )主板配什么显卡好 5年的台式电脑了想更新配置,反应速度有点慢。该如何提高,求大神指教... e2160超频设置 如何将多个excel表格合并成一个如何把多个工作簿合并成一个excel 上海社保最低比例是多少钱 es6自动泊车怎么用 蔚来ES6空调怎么使用?蔚来ES6怎么开空调? 淘宝投诉卖家那里怎么点不了发货问题 娷胶享草本膏是谁修改的 杰瑞蛋糕里为什么要放绿豆? 有买过令你的头发起死回生的洗护产品吗 杰瑞蛋糕怎么做 茅台镇国粹一号多少钱一瓶? 泸州国粹酒什么档次 隔离防晒和隔离霜不一样吗 在家护发养发小妙招 在家护发养发小妙招合集 红丝绒乳酪欧包的做法 全麦红丝绒蔓越莓乳酪软欧包怎么做 脸上皮肤很干的人能天天用精华素吗?24岁 屈臣氏里有买 肌研极润精华素 吗?? 肌研极润保湿精华素和DHC橄榄精华油哪个更好些??? 茨威格经典语录摘选 我拼多多上面买虎斑犬好不好? 什么软件买虎斑犬比较正宗? 江西上饶有没有虎斑犬? 茨威格名言名句 可以进口台湾凤梨酥吗 es6 import的几种情况总结 双鹿电池与丰银有什么区别 丰银7号蓄电池可以充电吗? 丰银电池离职手续怎么办理 君丰银酱酒怎么样 回转窑基础变形控制? 回转窑大小齿齿顶间隙规定在多少 摆喜字5毛硬币用多少个 解析硬币摆喜字方法 现在十七周肚子就好大了,正常吗?跟五个月的一样,有跟我... 一个男人一回家就翻箱倒柜的找东西,这是什么心理? 怀孕13周胎儿腹围72mm正常吗 怀孕13周股骨长1.0cm正常吗 普联技术的摄像头支持视通方案吗 哈尔滨米粉加盟有哪几个品牌,哪个好些? 黄天玲生榨米粉可以加盟吗 __i enjoy most is __i can have a holiday from work. 英语改错:But What I enjoy most are to be a head teacher.I treat m... enjoy...most 翻译 ...magazines___what l enjoy most划线处用are还是is