【Java前端技术栈】Promise

一、Promise 基本介绍

1. 传统的 Ajax 异步调用在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的Callback Hell

2. 为了解决上述的问题,Promise对象应运而生,在 EMCAScript 2015当中已经成为标准

3. Promise 是异步编程的一种解决方案

4. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息

5. Promise 也是 ES6 的新特性,因为比较重要

6. 一句话: Promise 是异步编程的一种解决方案, 可以解决传统 Ajax 回调函数嵌套问题

二、promise实例

jquery 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) {//如果请求成功了,回调处理函数successconsole.log("第1次ajax请求 monster基本信息=", resultData);//发出第二次ajax请求$.ajax({url: `data/monster_detail_${resultData.id}.json`,//下面是es6对象的方法简写形式success(resultData) {console.log("第2次ajax请求 monster详细信息=", resultData);//$.ajax => callback hell//$.ajax//$.ajax},error(err) { //出错的回调函数console.log("出现异常=", err);}})},error(err) {console.log("出现异常=", err);}})</script>
</head>
<body></body>
</html>

使用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.json//1. 创建Promise对象//2. 构造函数传入一个箭头函数//3. (resolve, reject) 参数列表resolve: 如果请求成功, 调用resolve函数//4. 如果请求失败, 调用reject函数//5. 箭头函数体, 仍然是通过jquery发出ajaxlet p = new Promise((resolve, reject) => {//发出ajax$.ajax({url: "data/monster.json",success(resultData) {//成功的回调函数console.log("promise发出的第1次ajax monster基本信息=", resultData);resolve(resultData);//p.thend的前置},error(err) {//console.log("promise 1发出的异步请求异常=", err);reject(err);}})})//这里我们可以继续编写请求成功后的业务p.then((resultData) => {//这里我们可以继续发出请求console.log("p.then 得到 resultData", resultData);return new Promise((resolve, reject) => {console.log(`data/monster_detail_${resultData.id}.json`),$.ajax({url: `data/monster_detail_${resultData.id}.json`,success(resultData) { //第2次ajax请求成功,回调函数console.log("第2次ajax请求 monster的详细信息=", resultData);//继续进行下一次的请求resolve(resultData);},error(err) { //第2次ajax请求失败,回调函数//console.log("promise2 发出的异步请求异常=", err);reject(err);}})})}).then((resultData) => {console.log("p.then().then(), resultData", resultData)//即可以在这里发出第3次ajax请求=》 获取该妖怪的女友return new Promise((resolve, reject) => {$.ajax({// url: `data/monster_gf_${resultData.gfid}.json`,success(resultData) { //第3次ajax请求成功,回调函数console.log("第3次ajax请求 monster女友的详细信息=", resultData);//继续进行下一次的请求//resolve(resultData);},error(err) { //第2次ajax请求失败,回调函数//console.log("promise2 发出的异步请求异常=", err);//reject(err);}})})}).catch((err) => { //这里可以对多次ajax请求的异常进行处理console.log("promise异步请求异常=", err);})</script>
</head>
<body></body>
</html>

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);}})})}//需求: 完成//1. 先获取monster.json//2. 获取monster_detail_1.json//2. 获取monster_gf_2.jsonget("data/monster.json").then((resultData) => {//第1次ajax请求成功后的处理代码console.log("第1次ajax请求返回数据=", resultData);return get(`data/monster_detail_${resultData.id}.json`);}).then((resultData) => {//第2次ajax请求成功后的处理代码console.log("第2次ajax请求返回数据=", resultData);//return get(`data/monster_detail_${resultData.id}.json`);return get(`data/monster_gf_${resultData.gfid}.json`);}).then((resultData) => {//第3次ajax请求成功后的处理代码console.log("第3次ajax请求返回数据=", resultData);//继续..}).catch((err) => {console.log("promise请求异常=", err);})</script>
</head>
<body></body>
</html>

课后作业 

<!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/student_100.json",success(data) {console.log("第一次ajax请求数据=", data);$.ajax({url: `data/class_${data.class_id}.json`,success(data) {console.log("第2次ajax请求数据=", data);$.ajax({url: `data/school_${data.school_id}.json`,success(data) {console.log("第3次ajax请求数据=", data);},error(err) {console.log("ajax请求发生异常:", err)}})},error(err) {console.log("ajax请求发生异常:", err)}})},error(err) {console.log("ajax请求发生异常:", err)}})</script>
</head>
<body></body>
</html>
<!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" src="script/promise_utils.js"></script><script type="text/javascript">//promise代码重排,完成多次ajax请求get("data/student_100.json").then(data => {console.log("第1次ajax请求, 返回的数据=", data);return get(`data/class_${data.class_id}.json`);}).then(data => {console.log("第2次ajax请求, 返回的数据=", data);return get(`data/school_${data.school_id}.json`);}).then(data => {console.log("第3次ajax请求, 返回的数据=", data);}).catch(err => {console.log("promise异步请求异常=", err);})</script>
</head>
<body></body>
</html>

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

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

相关文章

车道拓扑、目标布局、天气条件全都要!Text2Street:犀利的街景生成神器!

文本到图像生成在扩散模型的出现下取得了显著进展。然而&#xff0c;基于文本生成街景图像仍然是一项困难的任务&#xff0c;主要是因为街景的道路拓扑复杂&#xff0c;交通状况多样&#xff0c;天气情况各异&#xff0c;这使得传统的文本到图像模型难以处理。为了解决这些挑战…

每日一题——LeetCode1460.通过翻转子数组使两个数组相等

方法一 哈希Map 用两个Map集合分别统计target和arr里出现的元素和出现的次数&#xff0c;在比较两个Map集合看是否出现的元素和次数都相同 var canBeEqual function(target, arr) {let map1 new Map();let map2 new Map();for (let item of target) {map1.set(item, (map1…

039-安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化

039-安全开发-JavaEE应用&SpringBoot框架&Actuator监控泄漏&Swagger自动化 #知识点&#xff1a; 1、JavaEE-SpringBoot-监控系统-Actuator 2、JavaEE-SpringBoot-接口系统-Swagger 3、JavaEE-SpringBoot-监控&接口&安全问题 演示案例&#xff1a; ➢Spring…

机器人初识 —— 电机传动系统

一、背景 波士顿动力公司开发的机器人&#xff0c;其电机传动系统是其高性能和动态运动能力的核心部分。电机传动系统通常包括以下几个关键组件&#xff1a; 1. **电动马达**&#xff1a;波士顿动力的机器人采用了先进的电动马达作为主要的动力源&#xff0c;如伺服电机或步进…

【数据分享】2014-2024年全国监测站点的逐时空气质量数据(15个指标\Excel\Shp格式)

空气质量的好坏反映了空气的污染程度&#xff0c;在各项涉及城市环境的研究中&#xff0c;空气质量都是一个十分重要的指标。空气质量是依据空气中污染物浓度的高低来判断的。 我们发现学者王晓磊在自己的主页里面分享了2014年5月以来的全国范围的到站点的逐时的空气质量数据&…

OpenCV运行gstreamer管道获取相机数据,处理以后,再交给gstreamer显示(QT实现)

前言 无意中发现&#xff0c;OpenCV也可以运行gstreamer的命令管道&#xff0c;然后使用appsink来与OpenCV连接起来进行处理&#xff0c;在不断测试之下&#xff0c;先后实现了以下功能&#xff1a; 1. OpenCV运行gstreamer命令&#xff0c;通过appsink传递给OpenCV显示 2. Ope…

Java入门及环境变量

文章目录 1.1 Java简介1.2 JDK的下载和安装1.3 第一个程序1.4 常见问题1.5 常用DOS命令1.6 Path环境变量 1.1 Java简介 下面我们正式进入Java的学习&#xff0c;在这里&#xff0c;大家第一个关心的问题&#xff0c;应该就是 Java 是什么&#xff0c;我们一起来看一下&#xf…

ktutil编写生成keytab文件的脚本、通过keytab文件认证用户

文章目录 1. 生成keytab文件脚本2. 通过keytab文件认证3. 查看认证的用户4. 失效认证的用户 1. 生成keytab文件脚本 生成keytab文件的脚本 vim generate_kb.sh #!/usr/bin/bash ktutil <<EOF add_entry -password -p $1 -k 1 -e arcfour-hmac $2 write_kt $3 EOF示例&am…

C语言系列-带有副作用的宏参数#和##命名约定宏替换的规则

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 目录 带有副作用的宏参数 宏替换的规则 宏函数的对比 #和## #运算符 ##运算符 命名约定 #undef 带有副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候&#xff0c;如果…

Offer必备算法07_递归_五道力扣题详解(由易到难)

目录 递归算法原理 ①力扣面试题 08.06. 汉诺塔问题 解析代码 ②力扣21. 合并两个有序链表 解析代码 ③力扣206. 反转链表 解析代码 ④力扣24. 两两交换链表中的节点 解析代码 ⑤力扣50. Pow(x, n) 解析代码 本篇完。 递归算法原理 递归算法个人经验&#xff1a;给…

PHP支持的伪协议

php.ini参数设置 在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。 allow_url_fopen:默认值是ON。允许url里的封装协议访问文件&#xff1b; allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件&#xff1b; 各协议的利用条件和方法 php:/…

数据结构OJ题——top-k问题:最小的K个数(Java实现)

题目链接&#xff1a;top-k问题&#xff1a;最小的K个数 top-k问题&#xff1a;最小的K个数假 1.方法一2.方法二时间复杂度 3.方法三时间复杂度 1.方法一 各种排序算法&#xff08;由于本文主要讲有关堆的使用&#xff0c;这里不做有关排序算法解决本题的介绍。对于Top-K问题…

linux(阿里云)安装pytorch

目录 环境 安装步骤 1 检查python3和pip3是否已经安装 2 安装pytorch 3 安装完毕&#xff0c;检查pytorch版本 环境 阿里云 ubuntu 22.04 UEFI版 64位 安装步骤 1 检查python3和pip3是否已经安装 输入下面两条指令&#xff1a; python3 --version pip --version 检…

1Panel使用GMSSL+Openresty实现国密/RSA单向自适应

本文 首发于 Anyeの小站&#xff0c;转载请取得作者同意。 前言 国密算法是国家商用密码算法的简称。自2012年以来&#xff0c;国家密码管理局以《中华人民共和国密码行业标准》的方式&#xff0c;陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”&a…

ChatGPT对软件测试的影响!

ChatGPT 是一个经过预训练的 AI 语言模型&#xff0c;可以通过聊天的方式回答问题&#xff0c;或者与人闲聊。它能处理的是文本类的信息&#xff0c;输出也只能是文字。它从我们输入的信息中获取上下文&#xff0c;结合它被训练的大模型&#xff0c;进行分析总结&#xff0c;给…

【C++杂货铺】string详解

目录 1. 基本概念&#xff1a; 1.1 本质&#xff1a; 1.2 string和char*区别&#xff1a; 1.3 特点&#xff1a; 2. 构造函数(初始化) 3. 赋值操作 4. 字符串拼接 5 查找 和 替换 6. 字符串比较 7. 字符存取 8. 插入和删除 ​9. 子串获取 &#x1f308;前言&#x…

Rocky Linux网卡静态配置

一、开源系统 Rocky Linux 下载安装 1、安装教程 Rocky Linux 下载安装 二、远程工具 MobaXterm下载安装 1、安装教程 MobaXterm 下载安装 三、Rocky Linux 网卡配置 1、使用ip addr确认网卡名称&#xff08;此处可得知网卡为ens160&#xff09; [rootlocalhost ~]# ip a 1:…

23款奔驰GLE350升级小柏林音响 安装效果分享

小柏林之声音响是13个喇叭1个功放&#xff0c;功率是590W&#xff0c;对应普通音响来说&#xff0c;已经是上等了。像著名的哈曼卡顿音响&#xff0c;还是丹拿音响&#xff0c;或者是BOSE音响&#xff0c;论地位&#xff0c;论音质柏林之声也是名列前茅。星骏汇小许Xjh15863 升…

2.C语言——输入输出

1.字符输入输出函数 1.输入:getchar() 字面意思&#xff0c;接收单个字符&#xff0c;使用方法 char a; a getchar();实际上效果等同于char a; scanf("%c",&a);2.输出:putchar() 2.格式化输入输出函数 1.输入:scanf() 格式&#xff1a; scanf(“格式控制…

Axes属性汇总

Axes属性很多&#xff0c;主要起控制坐标区的外观和行为的作用&#xff0c;共涉及十三类。 第1类&#xff1a;字体 Font Name——字体名称&#xff0c;默认为’Helvetica’。 要使用在任何区域设置中都有较好显示效果的等宽字体&#xff0c;请使用 “FixedWidth”。等宽字体依…