zoukankan      html  css  js  c++  java
  • 迭代器和生成器

    迭代器

    迭代器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署迭代器接口,就可以完成遍历操作。

    ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费

    原生具备Iterator接口的数据有:Array,Arguments,Set,Map,String,TypedArray,NodeList

     

    工作原理

    1.  创建一个指针对象,指向当前数据结构的起始位置
    2. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
    3. 接下来不断调用next方法,指针一直往后移,直到指向最后一个成员
    4. 每调用next方法返回一个包含value和done属性的对象

     应用--自定义遍历数据

     

     类似上面的情况,想要遍历对象里面的数组,直接在obj上面遍历时,是会报错的,这个时候就需要自定义遍历:

    let obj={
                name:'张三',
                hobby:['足球','羽毛球','游泳','游戏'],
                [Symbol.iterator](){
                    let index = 0;
                    return{
                        next:()=>{
                            if(index <  this.hobby.length){
                                const result = {value:this.hobby[index],done:false};
                                index++;
                                return result;
                            }else{
                                return {value:undefined,done:true}
                            }
                        }
                    }
                }
            }
            for(let v of obj){
                console.log(v)
            }

    生成器

     生成器是一个特殊的函数,是异步编程的一种解决方式。

      

     next()方法的返回结果

      

     生成器函数参数

      

    在使用next传参时,第n个next的参数将作为第n-1个yield的整体返回结果。

      

     生成器实例

    例如,我们想要实现一个1s后打印111,然后过2s后再打印222,再然后3s后打印333的效果,如果使用定时器,可以写成下面这样

     这个时候就已经形成了回调地狱,如果还要继续添加的话,嵌套更深,为了解决这种异步的回调,就可以使用生成器:

    function one(){
        setTimeout(()=>{
            console.log(111);
            iterator.next();
        },1000)
    }
    function two(){
        setTimeout(()=>{
            console.log(222);
            iterator.next();
        },2000)
    }
    function three(){
        setTimeout(()=>{
            console.log(333);
            iterator.next();
        },3000)
    }
    function * gen(){
        yield one();
        yield two();
        yield three();
    }
    let iterator = gen();
    iterator.next();

     在实际项目中,经常一个接口的请求需求依赖于另一个接口请求的返回,常规的的做法有回调、promise等方法,除此之外,用生成器也可以实现:

      

  • 相关阅读:
    asp之缓存 cachestate
    ASP。net 之view
    ASP.net gridview之性别
    asp的gridview
    yii源码学习心得2
    yii源码学习心得
    什么是伪静态?伪静态有何作用?
    Yii2.0 时间日期插件之yii2-timepicker
    yii中调整ActiveForm表单样式
    8个新鲜的PHP常用代码
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/14082920.html
Copyright © 2011-2022 走看看