• ES6高级-迭代器与生成器的用法


    在讲生成器之前需要知道迭代器的用法,所以我们先来讲一下迭代器

    一、迭代器

    概念:迭代器是一个接口,能快捷地访问数据,通过Symbol.iterator来创建迭代器,通过迭代器的next()来获取迭代之后的结果。

    1. 我们直接来看下面这段代码:
    1.     <script>
    2.         const items = ['one', 'two', 'three'];
    3.         const ite = items[Symbol.iterator]();
    4.         // value表示遍历的值,done表示遍历继续,如果为true表示遍历完成
    5.         console.log(ite.next()); //{value: 'one', done: false}
    6.         console.log(ite.next()); //{value: 'two', done: false}
    7.         console.log(ite.next()); //{value: 'three', done: false}
    8.         console.log(ite.next()); //{value: undefined, done: true}
    9.     script>

      items[Symbol.iterator]是一个函数,所以返回迭代器的时候需要在后面加()进行掉用来返回迭代器

    二、生成器

    作用:generator函数可以通过yield关键字将函数挂起,为改变执行流提供了可能,同时为了做异步编程提供了方案。

     它和普通函数的差别在于:

    1.function后面函数名前面要加*

    2.只能在函数内部使用yield表达式,让函数挂起

    我们来看下面这段代码:
     

    1.     <script>
    2.         function* func() {
    3.                 console.log('one');
    4.                 yield 2;
    5.                 console.log('two');
    6.                 yield 3;
    7.                 console.log('three');
    8.             }
    9.             // 返回一个迭代器对象,阔以调用next
    10.         let fn = func();
    11.         console.log(fn.next());
    12.         console.log(fn.next());
    13.         console.log(fn.next());
    14.     script>

    输出结果是:

     总结:generator函数是分段执行的,yield语句是暂停执行,而next()是恢复执行。

    我们再来看一段代码:
     

    1.     <script>
    2.         function* add() {
    3.             console.log('start');
    4.             // x不是yield '2'的返回值,它是next()调用恢复当前yield()执行传入的实参
    5.             let x = yield '2';
    6.             console.log('one:' + x);
    7.             let y = yield '3';
    8.             console.log('two:' + y);
    9.             return x + y;
    10.         }
    11.         let fn = add();
    12.         console.log(fn.next());
    13.         console.log(fn.next(20));
    14.         console.log(fn.next(30));
    15.     script>

     输出结果:

     使用场景:为不具备Iterator接口的对象提供了遍历操作,下面这个代码也要认真看

    1.     <script>
    2.         function* func(obj) {
    3.             const propKeys = Object.keys(obj);
    4.             for (const keys of propKeys) {
    5.                 yield [keys, obj[keys]];
    6.             }
    7.         }
    8.         const obj = {
    9.             name: 'sy',
    10.             age: 18
    11.         }
    12.         for (let [key, value] of func(obj)) {
    13.             console.log(`${key},${value}`);
    14.         }
    15.     script>

     输出结果:

     三、生成器的应用

    我们先来看什么是回调地狱:

    简单来说就是去使用ajax发送请求的时候在里面收到数据后又发送请求,然后重复上面的操作。上面这样对异步编码非常不友好,这个时候就阔以使用生成器将异步代码同步化。

     

     再来看一个例子(重要):

    1.     <script>
    2.         // 加载loading...页面
    3.         // 数据加载完成...(异步操作)
    4.         // loading关闭掉
    5.         function* load() {
    6.             loadui();
    7.             yield showdata();
    8.             hideui();
    9.         }
    10.         let ite = load();
    11.         ite.next();
    12.         function loadui() {
    13.             console.log('加载loading...页面');
    14.         }
    15.         function showdata() {
    16.             setTimeout(function() {
    17.                 console.log('数据加载完成');
    18.                 ite.next();
    19.             }, 1000);
    20.         }
    21.         function hideui() {
    22.             console.log('隐藏loading...页面');
    23.         }
    24.     script>

  • 相关阅读:
    GBASE 8A v953报错集锦26--监控网站报错采集中心不可达
    配置vue3项目的eslint,Git提交时校验
    Redis缓存穿透和缓存击穿
    Python 解释器和编译器
    基于工业互联网标识解析的数字化治理研究
    Java核心知识1:泛型机制详解
    Vue2+Vue3基础入门到实战项目(七)——智慧商城项目
    R语言绘制矩形树状图
    高通平台Android 蓝牙调试和配置手册-- SCO Audio Quality Issues
    电子信息类毕业生找工作有多难?研究所难进?大厂太卷?
  • 原文地址:https://blog.csdn.net/qq_43781887/article/details/126142598