【es6笔记】es6的入门简介_迭代器(5)

这里整理了迭代器Iterator相关的内容。

<!DOCType html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
</head>

<body>
    <script>
        console.log("--------------迭代器Iterator--------------");
        /*
        迭代器Iterator是一种接口,可以让任何数据结构(包括数组、对象)都可以迭代。
        */
        const arr = ['小明', '小红', '小白'];

        // 1.for...of循环 Symbol.Iterator
        /*
        1.创建一个指针对象,指向当前初始位置
        2.第一次调用对象的next方法。指针自动指向第一个成员
        3.接下来不断的调用next方法,直到指针指向的成员不再存在
        4.每调用next方法返回一个包含value和done的对象
        */
        for (let i of arr) {
            console.log(i);
        }
        // 小明 小红 小白

        let iterator = arr[Symbol.iterator]();
        console.log(iterator); //Array Iterator {}
        console.log(iterator.next()); //{value: '小明', done: false}
        console.log(iterator.next()); //{value: '小明', done: false}
        console.log(iterator.next()); //{value: '小白', done: false}
        console.log(iterator.next()); //{value: undefined, done: true}

        for (let i in arr) {
            console.log(i);
        }
        // 0 1 2

        // 2.自定义遍历数据

        /*
        const obj = {
            name: '一班',
            stu: ['小明', '小红', '小刚']
        };

        这么遍历会报错
        for(let i of obj) {
            console.log(i);
        }
        */
        const obj = {
            name: '一班',
            stu: ['小明', '小红', '小白'],
            [Symbol.iterator]: function () {
                let index = 0;
                let self = this;
                return {
                    next: function () {
                        if (index < self.stu.length) {
                            let result = {
                                value: self.stu[index],
                                done: false
                            };
                            index++;
                            return result;
                        } else {
                            return {
                                value: self.stu[index],
                                done: true
                            }
                        }
                    }
                }
            }
        };

        for(let i of obj) {
            console.log(i);
        }
        // 小明 小红 小白


        console.log("--------------2.生成器--------------");
        // 2.生成器 Generator 异步编程 存回调函数

        function * gen() {
            console.log('print generator');
        }

        let iterator1 = gen();
        console.log(iterator1); //gen {<suspended>}
        iterator1.next(); // print generator

        function * gen2() {
            yield '第一个';
            yield '第二个';
            yield '第三个';
        }

        let iterator2 = gen2();
        console.log(iterator2.next()); //{value: '第一个', done: false}
        console.log(iterator2.next()); //{value: '第二个', done: false}
        console.log(iterator2.next()); //{value: '第三个', done: false}
        console.log(iterator2.next()); //{value: undefined, done: true}

        function * gen3(arg) {
            console.log(arg)
            let str = yield '第一个';
            console.log('1:',str);
            let str1 = yield '第二个';
            console.log(str1);
            yield '第三个';
        }

        let iterator3 = gen3("aa");
        console.log(iterator3.next("bb")); // aa {value: '第一个', done: false}
        console.log(iterator3.next("cc")); // cc {value: '第二个', done: false}
        console.log(iterator3.next()); //{value: '第三个', done: false}
        console.log(iterator3.next()); //{value: undefined, done: true}

        // 3.异步编程
        // setTimeout(() => {
        //     console.log(111);
        //     setTimeout(() => {
        //         console.log(222);
        //         setTimeout(() => {
        //             console.log(333);
        //         }, 3000);
        //     }, 2000);
        // }, 1000);

        function one(){
            setTimeout(() => {
                console.log(111);
                iterator4.next();
            }, 1000);
        };
        function two(){
            setTimeout(() => {
                console.log(222);
                iterator4.next();
            }, 2000);
        };
        function three(){
            setTimeout(() => {
                console.log(333);
                // iterator4.next();
            }, 3000);
        };

        function * gen4(){
            yield one();
            yield two();
            yield three();
        }

        let iterator4 = gen4();
        // iterator4.next();

        // 4.联系

        function getUsers(){
            setTimeout(()=>{
                let user = '用户信息';
                iterator5.next(user);
            },1000);
        }
        function getOrders(){
            setTimeout(()=>{
                let order = '订单信息';
                iterator5.next(order);
            },1000);
        }
       function  getGoods(){
           setTimeout(()=>{
                let goods = '商品数量';
                iterator5.next(goods);
              },1000);
        }

        function * gen5(){
           let user =  yield getUsers();
           console.log(user);
           let order = yield getOrders();
           console.log(order);
           let goods = yield getGoods();
           console.log(goods);
        }

        let iterator5 = gen5();
        iterator5.next();

    </script>
</body>

</html>

欢迎大家的意见和交流

email: li_mingxie@163.com