ES6-24【生成器与迭代器的应用】

一.迭代器

(1).es5方式手写迭代器

var arr = [1,2]
function generator(arr){
    var i = 0;
    return{
        next(){
           var done = i > arr.length ? true : false,
               value = done ? 'undefined' : arr[i++];
            return {
                value : value,
                done : done
            }  
        }
    }
}
var gen = generator(arr);
console.log(gen.next());
console.log(gen.next());
console.log(gen.next());

二.生成器

(1).按序执行方法

var fn = [
    function test1(){
        console.log(1);
        return true
    },
    function test2(){
        console.log(2);
        return false
    },
    function test3(){
        console.log(3);
        return true
    }
]
for(var i of fn){
    if(!i()){
        break
    }
}

(2).中间件原理

中间件集合:[test1,test2,test3]

将传入的值分别通过test1 ,test2, test3方法,如有一条执行不下去就立马结束

 这就是node的express中间件,洋葱模型

(3).通过生成器写中间件

;(function(functions){
    function * doFun(arr){
        for(var i = 0; i < arr.length; i++){
            yield arr[i];
        }
    }
    var iterator = doFun(functions);
    var init=()=>{
       nextDo(iterator.next())
    }
    function nextDo(fn){
        fn.value(function(){
            var fn = iterator.next();
            if(!fn.done){
                nextDo(fn)
            }else{
                return
            }
        })
        
    }
    init()
    
})
(
    [
        function test1(next){
            console.log(1);
            next()  
        },
        function test2(next){
            console.log(2);
            next()  
        },
        function test3(next){
            console.log(3);
            next()  
        }
    ]
)

模块化方式

index.js
 import M from '/shit.js' ;
M([test1,test2,test3])
function test1(next){
    console.log(1);
    next()  
}
function test2(next){
    console.log(2);
    next()  
}
function test3(next){
    console.log(3);
    next()  
}

shit.js
export default function(functions){
    function * doFun(arr){
        for(var i = 0; i < arr.length; i++){
            yield arr[i];
        }
    }
    var iterator = doFun(functions);
    var init=()=>{
       nextDo(iterator.next())
    }
    function nextDo(fn){
        fn.value(function(){
            var fn = iterator.next();
            if(!fn.done){
                nextDo(fn)
            }else{
                return
            }
        })
        
    }
    init()
}

index.html
<script type="module" src="index.js"></script>

这就是中间件的实现

迭代器常用于底层代码和日志的产生,其原理就是把push完的数组利用next特性 可以直接将本次迭代对象传入到操作函数中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值