当前位置: 首页 > news >正文

iterator和generator

iterator和generator

iterator

es6: let/const ...展开 

迭代器

是一种机制,比如在控制台输出Iterator是没有这个类的,为不同的数据结构提供迭代循环的机制。

迭代器对象:具备next方法,next能够对你指定的数据进行迭代循环,next依次取出集合中的每一项。第一次执行next拿第一项,第二次执行next拿第二项……

内部实现

具备Symbol.iterator

JS - iterator(迭代器)

内部实现

ps.done为true结束那个循环,为true时那个值也不要了

obj={name:'angela',age:18,sex:'female'}
Object.prototype[Symbol.iterator]=function(){
    let self=this;
    let keys=Object.keys(self)
    let index=0;
    return {
        next(){
            // 边界校验
            if(index>=keys.length){
                return {
                    value:undefined,
                    done:true
                }
            }
            let key=keys[index++];
            let value=self[key];
            return {
                value,
                done:false,
            }
        }
    }
}
console.dir(obj)
for(let value of obj){
    console.log(value)
}

JS中的循环

new Array(99999999)  // 这个时候还是一个稀疏数组

稀疏数组是不能使用for of循环的,使用fill填充

generator生成器

生成了一个具有迭代器规范的对象(迭代器对象),

返回一个迭代器对象

通过next&yield控制函数体中的代码一步步执行

每次next得到的value就是每次执行到yield(或return)后的值

每次next传值作为上次yield的返回结果

yield* 进入生成器执行

串行

终极解决方案:递归实现

初级版

判断是否是promise


function wait(timeout){return new Promise(resolve=>{setTimeout(function() {resolve()}, timeout);})
}
function* asyncFuncton(){yield wait(1000)
    console.log('第1秒')yield wait(2000)
    console.log('第2秒')yield wait(3000)
    console.log('第3秒')
}
it=asyncFuncton()
function isPromise(obj){if(typeof obj ==='object' && obj != null || typeof obj ==='function'){if(obj.then && typeof obj.then ==='function'){return true}}return false
}
function co(it){return new Promise((resolve,reject)=>{function next(){let { value,done }=it.next()
            console.log(value,done)if(done) return resolve();// 处理value为非promise的情况if(!isPromise(value)) value=Promise.resolve(value)
            value.then(()=>{next()}).catch((e)=>reject(e))}next()})}
co(it);

完善版:

http://www.lryc.cn/news/173560.html

相关文章:

  • ipv6笔记及总结
  • 64位Ubuntu20.04.5 LTS系统安装32位运行库
  • 关于vue.config.js
  • Jupyter NoteBook 中使用 cv2.imshow 显示图片
  • gpt扣款失败,openai扣款失败无法使用-如何解决gpt扣款失败的问题?
  • OJ练习第180题——颠倒二进制位
  • SpringSecurity授权--前端进行访问控制
  • 如何看待Unity新的收费模式?
  • WebRTC系列--sdp协商中的answer编解码协商过程
  • WeCanStudio工具套件介绍
  • 图形化思维:Graphviz和DOT语言的艺术与实践
  • 如何查看电脑详细配置、型号?这4个技巧 yyds!
  • 安卓机型固件系统分区的基础组成 手机启动规律初步常识 各分区的基本含义与说明
  • php如何把数组元素反转-array_reverse使用要点
  • 【CV学习笔记】tensorrtx-yolov5 逐行代码解析
  • 微信管理系统可以解决什么问题?
  • mysql事务测试
  • Spring面试题14:Spring中什么是Spring Beans? 包含哪些?Spring容器提供几种方式配置元数据?Spring中怎样定义类的作用域?
  • Tomcat部署、优化、以及操作练习
  • 服务器假死日志按时间统计排查
  • CSS——grid网格布局的基本使用
  • 【python】使用Nuitka打包python项目-demo示例
  • Java多线程篇(5)——cas和atomic原子类
  • 数据结构---栈和队列
  • 2023-9-23 合并果子
  • 基于QT和UDP实现一个实时RTP数据包的接收,并将数据包转化成文件
  • 云原生安全性:保护现代应用免受威胁
  • R语言绘图-3-Circular-barplot图
  • 解决Keil5下载没有对应芯片Flash的问题
  • 深拷贝与浅拷贝(对象的引用)