ES6学习Generator 函数(生成器)(八)

这里写目录标题

  • 一、基本概念
  • 二、代码
  • 三、Generator 函数的异步应用
      • 三级目录

一、基本概念

  • Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同,Generator 函数有多种理解角度。
  • 语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
    执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
  • 形式上,Generator函数是一个普通函数,但是有两个特征。一是, function 关键字与函数名之间有一个星号;二是,函数体内部使用 yield 表达式,定义不同的内部状态( yield 在英语里的意思就是“产出”)。
  • 由于 Generator 函数返回的遍历器对象,只有调用 next 方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。yield表达式就是暂停标志。

二、代码

        //生成器函数:function关键字和函数名之间有一个*
        function* add(){
            console.log('start');
            let x = yield '2';
            console.log('one:'+2);
            let y = yield '3';
            console.log('two:'+y);
            return x+y;

        }
        // 返回一个遍历器对象
        let fn=add();
        // next() 恢复执行标志
        console.log(fn.next());
        // 当 next() 传入参数时,该参数就会被当作上一个 yield 表达式的返回值 ,即 x = 20, y = 3
        console.log(fn.next(20));// one:20     {value: '3', done: false}
        console.log(fn.next(30));// two:30     {value: '50', done: true}
  • 使用场景:为不具备 Iterator 接口的对象提供了遍历操作
  • 利用for…of循环,可以写出遍历任意对象(object)的方法。原生的 JavaScript 对象没有遍历接口(不具备 Symbol.iterator方法),无法使用for…of循环,通过 Generator 函数为它加上这个接口,即将 Generator 函数加到对象的Symbol.iterator属性上面,就可以用了。
        //Gemerator 生成器函数
        function* objectEntries(obj) {
            //获取对象的所有key保存到数组
            const propKeys = Object.keys(obj);
            for (const propkey of propKeys) {
                yield [propkey, obj[propkey]]
            }

        }

        const obj = {
            book: 'ES6学习',
            price: 18
        }
        // 把 Generator 生成器函数赋值给对象的Symbol.iterator属性, 为该对象加上遍历器接口
        obj[Symbol.iterator] = objectEntries;
        console.log(obj);//{book: 'ES6学习', price: 18, Symbol(Symbol.iterator):
        // objectEntries(obj) 等价于 obj[Symbol.iterator](obj) 
        for (let [key, value] of objectEntries(obj)) {
            console.log(`${key}: $value`);
        }

三、Generator 函数的异步应用

Generator 函数在ajax请求的异步应用,让异步代码同步化

Generator 函数在加载页面的异步应用

       //Generator 函数在加载页面的异步应用
       // 1.加载 Loading...页面
       // 2.数据加载完成...(异步操作)
       // 3.Loading 关闭掉
       function loadUI() {
           console.log('加载 Loading...页面');
       }

       function showData() {
           // 模拟数据加载异步操作
           setTimeout(() => {
               console.log('数据加载完成');
           }, 1000);
       }

       function hideUI() {
           console.log('隐藏 Loading...页面');
       }

       loadUI();
       showData();
       hideUI();

上述代码执行后效果:

加载 Loading...页面
隐藏 Loading...页面
数据加载完成

实际需求是加载数据完成后才关闭页面,但由于三个函数函数是同步执行的,数据加载需要时间,在数据未加载完成时,就已经隐藏loading页面。通过 Generator 函数可以解决这个问题。

         function* load(){
            loadUI();
            yield showData();     
            hideUI()
        }

        const itLoad = load();
        itLoad.next();

        function loadUI() {
            console.log('加载 Loading...页面');
        }

        function showData() {
            // 模拟数据加载异步操作
            setTimeout(() => {
                console.log('数据加载完成');
                itLoad.next();
            }, 1000);
        }

        function hideUI() {
            console.log('隐藏 Loading...页面');
        }

三级目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940403.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抽象之诗:C++模板的灵魂与边界

引言 在计算机科学的浩瀚长河中,C模板如同一颗璀璨的星辰,以其独特的泛型编程方式为程序设计注入了灵魂。它是抽象的艺术,是类型的舞蹈,是效率与灵活性的交响乐。模板不仅是一种技术工具,更是一种哲学思考&#xff0c…

Linux通信System V:消息队列 信号量

Linux通信System V:消息队列 & 信号量 一、信号量概念二、信号量意义三、操作系统如何管理ipc资源(2.36版本)四、如何对信号量资源进行管理 一、信号量概念 信号量本质上就是计数器,用来保护共享资源。多个进程在进行通信时&a…

day4:tomcat—maven-jdk

一,java项目部署过程 编译:使用javac命令将.java源文件编译成.class宇节码文件打包:使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式,如.jar文件,或者.war文件(用于web应用&#xff09…

提炼关键词的力量:AI驱动下的SEO优化策略

内容概要 在当今数字化营销的环境中,关键词对于提升网站的可见性和流量起着至关重要的作用。企业和个人必须重视有效的关键词策略,以便在竞争激烈的网络市场中脱颖而出。本文将深入探讨如何利用人工智能技术来优化SEO策略,特别是在关键词选择…

仓鼠身长能长到多少厘米?

仓鼠,作为颇受欢迎的宠物,其小巧玲珑的身形是吸引众多饲主的重要原因之一。那么,仓鼠的身长究竟能长到多少厘米呢?这背后其实蕴含着不少有趣的知识。 一般而言,常见的仓鼠品种如三线仓鼠、紫仓仓鼠等,成年…

八大设计模式

设计模式在日常软件开发中的重要性 目录 单例模式工厂模式策略模式代理模式观察者模式装饰器模式模板方法模式建造者模式总结 单例模式 单例模式确保一个类只有一个实例,通常用于管理共享资源,如配置、缓存、线程池等。 代码实现:双重检查…

直流充电桩基本工作原理

1、控制导引电路 2、电动汽车直流快充工作原理 1)第一阶段 未充电自然状态阶段 充电枪处于自然阶段,充电枪上的按钮没有按下,也就是电路图中的开关S处于接通状态,此时R1 、 R2串联,检测点1处的电压为6V 2)…

c4d动画怎么导出mp4视频,c4d动画视频格式设置

宝子们,今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的,让你能轻松理解和掌握,不管是理论基础,还是实际操作和技能技巧,都能学到,快速入门然后提升自己哦。 c4d动…

【原生js案例】ajax的简易封装实现后端数据交互

ajax是前端与后端数据库进行交互的最基础的工具,第三方的工具库比如jquery,axios都有对ajax进行第二次的封装,fecth是浏览器原生自带的功能,但是它与ajax还是有区别的,总结如下: ajax与fetch对比 实现效果 代码实现 …

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1)导出数据到本地目录 2)导出到hdfs的目录下 3)直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图,打包提示未添加maps模块解决方案 这是报错信息,在标准基座运行的时候是没问题的,但是打包后会提示未添加,可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key,定位服务可以继续用腾…

OpenCV 学习记录:首篇

最近在学习机器视觉,希望能通过记录博客的形式来鞭策自己坚持学完,同时也把重要的知识点记录下来供参考学习。 1. OpenCV 介绍与模块组成 什么是 OpenCV? OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软…

白嫖内网穿透之神卓互联Linux安装教程(树莓派)

最近家里有一个树莓派,捣鼓来去不知道干嘛,于是打算作为内网穿透盒子用,于是百度了一下,发现神卓互联还不错,可以让外网请求通过各种复杂的路由和防火墙访问到内网的服务。 以下是在Linux树莓派系统上安装神卓互联客户…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例,这是第(一)例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

深度学习实验十七 优化算法比较

目录 一、优化算法的实验设定 1.1 2D可视化实验(被优化函数为) 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …

【计算机组成1】计算机系统

一、计算机的发展 1、计算机硬件的发展 第一代计算机(1946— 1957 年 )——电子管时代。 第二代计算机(1958 — 1964年)——晶体管时代 第三代计算机(1965— 197 1 年) ——中小规模集成电路时代 第四代计算机(1972年至今)——超大规模集成电路时代 计算机硬件的发展就是逻辑元…

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity,发现了一个我想要研究的服务。代码看起来是这样的: Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里?人们似乎不再使用普通的 Solidity 代码了 🥲 这种在智能…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果,它们在底层是怎样做的? 2.Spring给我们提供了很多扩展点,这些有了解吗? 3.MVC分层介绍一下? 4.了解SpringMVC的处理流程吗? 5.Handlermapping 和 handleradapter有…

kkfileview代理配置,Vue对接kkfileview实现图片word、excel、pdf预览

kkfileview部署 官网:https://kkfileview.keking.cn/zh-cn/docs/production.html 这个是官网部署网址,这里推荐大家使用docker镜像部署,因为我是直接找运维部署的,所以这里我就不多说明了,主要说下nginx代理配置&am…

SQL语句整理五-StarRocks

文章目录 查看版本号:SPLIT:insert 和 update 结合 select:报错:1064 - StarRocks planner use long time 3000 ms in memo phase:字段增删改: 查看版本号: select current_version(); current…