• ES6解析*项目学习记录(四)


    14. iterator 和 for...of 循环

    * 不同的数据结构通过 for...of 统一的这种形式来达到读取不同数据结构的目标
    * 但是背后的iterator接口是不一样的

    iterator

    {
      //循环数组
      let arr = ["hello", "world"];
      let map = arr[Symbol.iterator]();
      console.log(map.next()); //{value: "hello", done: false}
      console.log(map.next()); //{value: "world", done: false}
      console.log(map.next()); //{value: undefined, done: true}
    }
    {
      //自定义iterator 接口
      let obj = {
        start: [1, 3, 2],
        end: [7, 9, 8],
        [Symbol.iterator]() {
          let self = this;
          let index = 0;
          let arr = self.start.concat(self.end);
          let len = arr.length;
          return {
            next() {
              if (index < len) {
                return {
                  value: arr[index++],
                  done: false
                };
              } else {
                return {
                  value: arr[index++],
                  done: true
                };
              }
            }
          };
        }
      };
      for (let key of obj) {
        console.log(key); //1 3 2 7 9 8
      }
    }

    for...of

    {
      let arr = ["hello", "world"];
      for (let item of arr) {
        console.log("item", item);
        // hello
        // world
      }
    }

    15. Generator 

    异步编程的解决方案

    基本定义

    {
      // 基本定义
      let tell = function*() {
        yield "a";
        yield "b";
        return "c";
      };
      let k = tell();
      // 调用next()时 会去执行第一个yield,保证了函数体内异步操作的过程
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());
      // {value: "a", done: false}
      // {value: "b", done: false}
      // {value: "c", done: true}
      // {value: undefined, done: true}
    }

    generator 和 iterator 的关系

    {
      let obj = {};
      obj[Symbol.iterator] = function*() {
        yield 1;
        yield 2;
        yield 3;
      };
    
      for (let value of obj) {
        console.log(value);
        //1
        //2
        //3
      }
    }

    状态机

    {
      //状态机
      let state = function*() {
        while (1) {
          yield "A";
          yield "B";
          yield "C";
        }
      };
      let status = state();
      console.log(status.next());
      console.log(status.next());
      console.log(status.next());
      console.log(status.next());
      console.log(status.next());
      // {value: "A", done: false}
      // {value: "B", done: false}
      // {value: "C", done: false}
      // {value: "A", done: false}
      // {value: "B", done: false}
    }
    
    // async await
    // {
    //   let state = async function() {
    //     while (1) {
    //       await "A";
    //       await "B";
    //       await "C";
    //     }
    //   };
    //   let status = state();
    //   console.log(status.next());
    //   console.log(status.next());
    //   console.log(status.next());
    //   console.log(status.next());
    //   console.log(status.next());
    // }

    实例

    {
      //抽奖
      let draw = function(count) {
        //具体抽奖逻辑
        console.log(`剩余${count}次`);
      };
      //计算次
      let residue = function*(count) {
        while (count > 0) {
          count--;
          yield draw(count);
        }
      };
    
      let star = residue(5);
      let btn = document.createElement("button");
      btn.id = "start";
      btn.textContent = "抽奖";
      document.body.appendChild(btn);
      document.getElementById("start").addEventListener(
        "click",
        function() {
          star.next();
        },
        false
      );
    }
    
    {
      //长轮询
      let ajax = function*() {
        yield new Promise(function(resolve, reject) {
          setTimeout(() => {
            resolve({ code: 0 });
          }, 200);
        });
      };
    
      let pull = function() {
        let generator = ajax();
        let step = generator.next();
        step.value.then(function(d) {
          if (d.code != 0) {
            setTimeout(() => {
              console.info("wait");
              pull();
            }, 1000);
          } else {
            console.info(d);
          }
        });
      };
    
      pull(); //{code: 0}
    }

    16. Decorator - 修饰器

    一个用来修改类的行为的 函数,可以理解为扩展类的功能
    {
      let readonly = function(target, name, descriptor) {
        descriptor.writable = false;
        return descriptor;
      };
    
      class Test {
        //在这里加了修饰器  不允许重新赋值
        @readonly
        Time() {
          return "2019-07-11";
        }
      }
    
      let test = new Test();
    
      console.log(test.Time()); //2019-07-11
    }
    {
      let typename = function(target, name, descriptor) {
        target.myname = "hello";
      };
    
      @typename
      class Test {}
      //类修饰符
      console.log(Test.myname); //hello
    }
    {
      let log = type => {
        return function(target, name, descriptor) {
          let src_method = descriptor.value;
          descriptor.value = (...arg) => {
            src_method.apply(target, arg);
            console.info(`log ${type}`);
          };
        };
      };
    
      class AD {
        @log("show")
        show() {
          console.info("ad is show");
        }
        @log("click")
        click() {
          console.info("ad is click");
        }
      }
    
      let ad = new AD();
      ad.show();
      ad.click();
    }

    17. 模块化

    方法一

    导出

    /*  方法一
    export let A = 123;
    
    export function test() {
      console.log("test");
    }
    
    export class Hello {
      test() {
        console.log("class");
      }
    }
    */

    引入

    // import { A, test, Hello } from "./class/lesson17";
    // import { A } from "./class/lesson17";
    // import * as lesson from "./class/lesson17";

    方法二(推荐)

    导出

    let A = 123;
    let test = function() {
      console.log("test");
    };
    
    class Hello {
      test() {
        console.log("class");
      }
    }
    
    export default {
      A,
      test,
      Hello
    };

     引入

    import lesson17 from "./class/lesson17";

    使用

    // console.log(A, test, Hello);
    // console.log(A);
    // console.log(lesson.A);
    // console.log(lesson.test());
    console.log(lesson17.A);
  • 相关阅读:
    poj3294 Life Forms(后缀数组)
    1628. White Streaks(STL)
    1523. K-inversions(K逆序对)
    1890. Money out of Thin Air(线段树 dfs转换区间)
    1350. Canteen(map)
    1521. War Games 2(线段树解约瑟夫)
    1003. Parity(并查集)
    1470. UFOs(三维树状数组)
    1471. Tree(LCA)
    1494. Monobilliards(栈)
  • 原文地址:https://www.cnblogs.com/anqwjoe/p/11175075.html
Copyright © 2020-2023  润新知