前端技术栈二(promise模块化编程)

一、promise

1 Promise 基本介绍

  • 传统的 Ajax 异步调用在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的 Callback Hell
  • 为了解决上述的问题,Promise 对象应运而生,在 EMCAScript 2015 当中已经成为标准 Promise 是异步编程的一种解决方案。
  • 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息
  • 一句话: Promise 是异步编程的一种解决方案, 可以解决传统 Ajax 回调函数嵌套问题

2 应用实例

2.1 需求分析/图解 

2.2 代码实现 

2.2.1 json

创建 D:\idea_java_projects\es6\promise\data\monster.json 

创建 D:\idea_java_projects\es6\promise\data\monster_detail_1.json 

2.2.2 使用 ajax 传统方式 
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>jquery-ajax多次请求</title><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">$.ajax({url:"data/monster.json",success(resultData){console.log("第一次ajax请求,我们拿到了monster基本信息=",resultData);//进行第二次请求,此时就出现了ajax的嵌套$.ajax({url: `data/monster_detail_${resultData.id}.json`,success(resultData) {console.log("第二次ajax请求,我们拿到了monster详细信息=",resultData);},error(err) {console.log("第二次出现异常=",err)}})},error(err){console.log("出现异常=",err)}})</script>
</head>
<body></body>
</html>
 2.2.3 使用 promise 方式
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>使用promise完成多次ajax请求</title><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">//先请求到monster.jsonlet p =new Promise((resolve,reject)=>{//创建promise对象需要传入一个箭头函数//(resolve,reject)参数列表,如果请求成功调用resolve函数,失败调用reject函数//箭头函数体仍然是通过jquery发出ajax//发出ajax请求$.ajax({url:"data/monster.json",success(resultData){console.log("promise发出的第一次ajax monster的基本信息=",resultData);resolve(resultData);},error(err){//console.log("promise发出的异步请求出现错误=",err)reject(err);}})})//这里我们可以继续编写请求成功后的业务p.then(resultData=>{console.log("p.then得到了resultData",resultData);return  new Promise((resolve, reject) => {//如果没有return 那么这里的error捕获不到给p$.ajax({url: `data/monster_detail_${resultData.id}.json`,success(resultData) {console.log("promise发出的第二次ajax monster的详细信息=",resultData)resolve(resultData)},error(err) {//console.log("promise第二次发出的异步请求出现错误=",err)reject(err)}})})}).then((resultData=>{console.log("p.then().then,resultData",resultData)//可以在这里发出第三次请求})).catch(err=>{//这里可以对多次ajax的异常进行处理console.log(err)})</script>
</head>
<body></body>
</html>

 

2.2.4使用 promise 代码优化/重排 
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>promise 代码重排</title><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">/*** 这里我们将重复的代码,抽出来,编写一个方法 get ** @param url ajax 请求的资源* @param data ajax 请求携带的数据* @returns {Promise<unknown>}** */function get(url,data) {return new Promise((resolve, reject) => {$.ajax({url:url,data:data,success(resultData){resolve(resultData);},error(err){reject(err);}})})}//需求//先获取monster.json//获取monster_detail1.json//进入第三次get("data/monster.json").then(resultData=>{//第一次ajax成功后的处理位置console.log(resultData);return get(`data/monster_detail_${resultData.id}.json`);}).then(resultData=>{//第二次成功后的处理代码console.log("第二次成功后的结果=",resultData);//如果还需要下一把//return get(url,data)以此类推}).catch(err=>{console.log(err);})</script>
</head>
<body></body>
</html>
 2.2.5 注意事项和使用细节
  •  如果返回的是 Promise 对象,可以继续执行.then()
  •  .then((data)=>{}) data 数据是上一次正确执行后 resolve(data) 返回传入的
  •  通过多级.then() 可以对异步请求分层次请求,实现代码重排,代码逻辑更加清晰合理
  •  通过多级.then() 后面的 .catch((err) => {}) 可捕获发生异常,便于调试

 3 Promise 课后练习

 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>homework</title><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">function get(url,data) {return new Promise((resolve, reject) => {$.ajax({url:url,data:data,success(resultData){resolve(resultData);},error(err){reject(err);}})})}get("data/student_100.json").then(resultData=>{console.log("第1=",resultData);return get(`data/class_${resultData.class_id}.json`);}).then(resultData=>{console.log("第2=",resultData);return get(`data/school_${resultData.school_id}.json`);}).then(resultData=>{console.log("第3=",resultData);}).catch(err=>{console.log(err);})</script>
</head>
<body></body>
</html>

 二、模块化编程

1介绍 

1.1基本介绍

  • 传统非模块化开发有如下的缺点:(1)命名冲突 (2)文件依赖[代码演示]
  • Javascript 代码越来越庞大,Javascript 引入模块化编程,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块
  • Javascript 使用"模 块"module)的概念来实现模块化编程, 解决非模块化编程问题
  • 模块化 也是 ES6 的新特性

1.2 示意图 

 1.3 模块化编程分类

  • CommonJS 模块化规范/ES5 的写法
  • ES6 模块化规范

 2 CommonJS 模块编程

2.1 介绍 

  • 每个 js 文件就是一个模块,有自己的作用域。在文件中定义的变量、函数、类/对象,都是私有的,对其他 js 文件不可见
  • CommonJS 使用 module.exports={} / exports={} 导出 模块 , 使用 let/const 名称 = require("xx.js") 导入模块

2.2 应用实例 

2.2.1 需求说明 
  • 编写 functions.js , 该文件有函数,变量, 常量, 对象, 数组。。。
  • 要求在 use.js , 可以使用到 function.js 中定义的 函数/变量/常量/对象
  • 请使用模块化编程的方式完成, 尽量将各种写法都写一下
2.2.2 思路分析/图解 
 2.2.3 代码实现

function.js 

//定义对象,变量,常量,函数
const sum=function (a,b) {return parseInt(a)+parseInt(b);}
const sub=function (a,b) {return parseInt(a)-parseInt(b);
}
let name="林然";const PI=3.14;const monster={name:"牛魔王",age:500,hi(){console.log("我是牛魔王,你好");}
}//导出
/*
1. module.exports 导出模块
2. 把你需要导出的数据, 写入到 {}中即可
3. 可以全部导出,也可以部分导出
4. 理解:相当于把我们导出的数据,当做一个对象
5. 如果属性名和函数/变量/对象..名字相同,可以简写
6. 有些前端, 简写 module.exports={} 成 exports={}
*/
module.exports={sum:sum,sub,//简写myname:name
}

 use.js

//导入
//1. 在 es5 中, 我们通过 require 就包 对应.js 中的
//数据/对象,引入
//2. 我们使用的时候,通过 m.属性 就可以使用
//3. 如果我们导入时,不需要所有的,可以导入部分数据
const m=require("function");
console.log(m.myname);
console.log(m.sub(2,3));//3. 如果我们导入时,不需要所有的,可以导入部分数据
const {sub,sum} =require("./function");
console.log(sub(1,3))
console.log(sum(1,3))
要看运行效果,需要 Node 环境 , node 环境我们后面搭建 , 只要 use.js 可以解析 sum
sub 说明是正确的

3 ES6 模块编程

3.1 介绍

  • ES6 使用 (1)export {名称/对象/函数/变量/常量} (2) export 定义【对象】 ={} (3) export default {}
  • 导出模块
  • 使用 import {} from "xx.js" [对应(1)(2)]/ import 名称 form "xx.js" 导入模块

3.2 应用实例-批量导出形式 

3.2.1 需求说明

  • 编写 common.js , 该文件有函数,变量, 常量, 对象
  • 要求在 use_common.js , 可以使用到 common.js 中定义的 函数/变量/常量/对象
  • 请使用 ES6 模块化编程的方式完成
3.2.2 思路分析/图解 

common.js 

//定义对象,变量,常量,函数
const sum=function (a,b) {return parseInt(a)+parseInt(b);}
const sub=function (a,b) {return parseInt(a)-parseInt(b);
}
let name="林然";const PI=3.14;const monster={name:"牛魔王",age:500,hi(){console.log("我是牛魔王,你好");}
}
//es6 的导出模块/数据
/*** 老师解读* 1. export 就是导出模块/数据* 2. 可以全部导出,也可以部分导出*/
export {sum,sub,name
}

use_common.js

//导入
/**** 1. 我可以{} 来接收导出的数据* 2. 可以全部接收,也可以选择的接收* 3. 细节: 这时要求导入的名称和导出的名称一致*/
import {sum,name,sub} from "./common"
console.log(name);

3.3 应用实例-其它导出形式

common2.js

//定义对象,变量,常量,函数
//定义对象,变量,常量, 函数
//定义 sum 函数时,就直接导出
//如果在定义时,导出的数据, 在导入时,要保持名字一致
export const sum=function (a,b) {return parseInt(a)+parseInt(b);}
const sub=function (a,b) {return parseInt(a)-parseInt(b);
}
let name="林然";const PI=3.14;const monster={name:"牛魔王",age:500,hi(){console.log("我是牛魔王,你好");}
}
//es6 的导出模块/数据
/*** 老师解读* 1. export 就是导出模块/数据* 2. 可以全部导出,也可以部分导出*/
export {sum,sub,name
}

use_common2.js

//导入
/**** 1. 我可以{} 来接收导出的数据* 2. 可以全部接收,也可以选择的接收* 3. 细节: 这时要求导入的名称和导出的名称一致*/
import {sum} from "./common2"
console.log(sum(1,3));

common3.js

//定义对象,变量,常量, 函数
//演示默认导出
//如果是默认导出, 导入的时候,使用的语法
//可以这里理解, 类似把 {} 当做一个对象导出
export default {sum(a,b) {return parseInt(a) + parseInt(b);},sub(a,b) {return parseInt(a) - parseInt(b);}
}
use_common3.js
//导入默认导出模块/数据
//好处是 m 名称是可以自己指定的.
//因为 m 名字, 程序员可以自己指定,因此我们就可以解决名称冲突问题
import m from "./common3";
//使用 m.xx
console.log(m.sub(80,90));

3.4 注意事项和使用细节

  • ES6 的模块化无法在 Node.js 中执行,需要用 Babel 转码 ES5 后再执行
  • export 不仅可以导出对象,一切 JS 变量都可以导出。比如:基本类型变量、函数、数组、对象
  • 没有导出的不能使用
  • es6 有导出方式较多, 不同的导出方式对导入方式也有一定影响

课后作业 

4.1 作业1 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

M1失效后,哪个是观察A股的关键新指标?

M1失效后&#xff0c;哪个是观察A股的关键新指标&#xff1f; 央地支出增速差&#xff08;地方-中央支出增速的差值&#xff09;或许是解释沪深300定价更有效的前瞻指标。该数值扩张&#xff0c;则有利于大盘指数&#xff0c;反之亦然&#xff0c;该指标从2017年至今对大盘指数…

Hedra:让您的照片说话

在数字内容创作的世界里&#xff0c;我们总是在寻找那些能够让我们的作品更加生动和吸引人的工具。Hedra软件就是这样一款工具&#xff0c;它能够让您的照片动起来&#xff0c;甚至说话。想象一下&#xff0c;您的家庭相册中的照片突然变得栩栩如生&#xff0c;或者您的产品图片…

Python微磁学磁倾斜和西塔规则算法

&#x1f4dc;有限差分-用例 &#x1f4dc;离散化偏微分方程求解器和模型定型 | &#x1f4dc;三维热传递偏微分方程解 | &#x1f4dc;特定资产期权价值偏微分方程计算 | &#x1f4dc;三维波偏微分方程空间导数计算 | &#x1f4dc;应力-速度公式一阶声波方程模拟二维地震波…

磁链观测器设计与Simulink建模

1. 磁链观测器设计 如下方程描述了模块输入计算永磁同步电机得电角度&#xff0c;磁通量和电扭矩。 假设 那么&#xff0c;以下拉普拉斯变换表示 Ψα 和 Ψβ 中的积分项&#xff1a; 为了滤除噪声信号&#xff0c;这里使用带低通滤波器得积分器。注意&#xff0c;低通滤波器得…

[笔记] CCD相机测距相关的一些基础知识

1.35mm胶片相机等效焦距 https://zhuanlan.zhihu.com/p/419616729 拿到摄像头拍摄的数码照片后&#xff0c;我们会看到这样的信息&#xff1a; 这里显示出了两个焦距&#xff1a;一个是实际焦距&#xff1a;5mm&#xff0c;一个是等效焦距&#xff1a;25mm。 实际焦距很容易…

OpenGL3.3_C++_Windows(14)

demo演示 demo演示 天空盒 作用&#xff1a;我们想要一个立方体每个面都有不同的纹理&#xff0c;可以在while使用&#xff1a;glActiveTexture&#xff08;&#xff09;&#xff0c;激活绑定相应纹理&#xff0c;glVertexAttribPointer设置布局&#xff0c;glDrawArrays&…

21.0docker企业级镜像仓库harbor(vmware 中国团队)

docker企业级镜像仓库harbor(vmware 中国团队) 网站下载harbor软件包 https://github.com/goharbor/harbor 查看软件安装harbor版本需求限制 本地环境需求已满足 点击下载harbor安装包 点击releases根据版本信息下载 下面的在线安装就是docker pull。离线就是下载之后…

机器学习课程复习

参考书目:《统计学习方法》 选择题 5道 3分/道 填空题 5道 3分/道 简答题 3道 计算题 1道 算法设计题 1道 隐马尔可夫不考计算题 很有可能考计算题的知识点:KNN、决策树、支持向量机、聚类算法 小概率会考计算题的知识点:线性回归(最小二乘法,代公式算参…

23种设计模式之桥接模式

桥接模式 1、定义 桥接模式&#xff1a;将抽象部分与它的实现部分解耦&#xff0c;使得两者都能独立变化 2、桥接模式结构 Abstraction&#xff08;抽象类&#xff09;&#xff1a;它是用于定义抽象类的&#xff0c;通常是抽象类而不是接口&#xff0c;其中定义了一个Imple…

Spark Core内核调度机制详解(第5天)

系列文章目录 如何构建DAG执行流程图 (掌握)如何划分Stage阶段 (掌握)Driver底层是如何运转 (掌握)确定需要构建多少分区(线程) (掌握) 文章目录 系列文章目录引言一、Spark内核调度&#xff08;掌握&#xff09;1.1、内容概述1.2、RDD的依赖1.3、DAG和Stage1.4、Spark Shuffl…

Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像

一&#xff1a;docker-hub官网寻找需求镜像 1.我们在https://hub.docker.com/官网找到要封装的pytorch基础镜像&#xff0c;这里我们以pytorch1.13.1版本为例 2.我们找到的这个devel版本的镜像&#xff08;我们需要cuda的编译工具&#xff09; pytorch版本是1.13.1&#xff0c;…

网络校时服务器:铁路对时有妙招

在信息高速发展的今天&#xff0c;铁路作为国家的经济大动脉&#xff0c;与广大市民生活息息相关&#xff0c;担负着运送大流量乘客、保证交通畅通的重任&#xff0c;为了保证列车的正点运行和乘客的行程&#xff0c;对时间精准度的要求是非常严格的。随着我国铁路的发展速度和…

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash&#xff0c;都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目&#xff08;AOSP&#xff09;平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同&#xff0c;ASfP 具有多语言支持&#xff0c;可以在同一 IDE 中编写 C、Kotli…

分页插件bs_pagination与Bootstrap4、jQuery3.7.1不兼容的问题

问题场景&#xff1a; 开发环境&#xff1a; 项目&#xff1a;CRM IDE&#xff1a;intelij IDEA JDK: jdk21.0.2 JQuery&#xff1a;3.7.1 Bootstrap&#xff1a;4.6 项目中需要查询数据库中的数据&#xff0c;并且以分页显示的方式显示在页面上&#xff0c;前端页面用到了分页…

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助。《Ubuntu Linux运…

高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案

一、背景需求分析 随着信息技术的迅猛发展&#xff0c;小型机房在企事业单位中扮演着越来越重要的角色。为了确保机房的安全稳定运行&#xff0c;远程监控成为了必不可少的手段。 二、视频监控 视频监控是机房远程监控的重要组成部分。通过安装IP摄像机及部署视频监控系统Ea…

11.【机器学习】十大算法之一随机森林算法原理讲解

【机器学习】十大算法之一随机森林算法原理讲解 一摘要二个人简介三什么是随机森林&#xff1f;3.1 决策树3.2 集成方法3.2.1 Bagging方法3.2.2 Boosting方法 3.3 随机森林算法3.4 随机的含义 四案例演示一4.1 利用随机森林进行特征选择&#xff0c;然后使用SVR进行训练4.2 利用…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者&#xff1a;Hongbo 01 &#x1f4a1;TL;DR 在加密投资领域如何找到真正的“价值”&#xff1a;Crypto 作为一种新兴资产&#xff0c;应该找到一种区别于传统公司股票资产的估值方法&#xff0c;本文重点阐述了加密货币作为新的资产类型与传统资…